首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

~为啥堆空间没有被破坏~

2013-07-08 
~~~~~~~~~~~~为什么堆空间没有被破坏~~~~~~~~~~~Stringstrcpy[解决办法]越界不够远。而且此后没有操作堆。#i

~~~~~~~~~~~~为什么堆空间没有被破坏~~~~~~~~~~~

                                                  String                    strcpy                                              
[解决办法]
越界不够远。而且此后没有操作堆。

#include<iostream>
#include <string>
#include <cstring>
using namespace std;
 
 
int main()
{
    string str1(1048576,' ');
 
    char* s = new char[2];
     
    strcpy(s, str1.c_str());
 
    delete[]s;
    return 0;
}



[解决办法]
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。

操作系统内存管理的粒度不是1字节,通常是1页即4KB
[解决办法]

#include<iostream>
#include <string>
using namespace std;
 
 
int main()
{
    string str1;
 
    char* s = new char[2];
   
    cin >> str1;
 
    strcpy(s, str1.c_str());
    delete [] s; //这一步可能会崩溃哦,你没有delete 本身程序就错了 
    return 0;
}

//你再这样试试
#include<iostream>
#include <string>
using namespace std;
 
 
int main()
{
    string str1;
 
    char* s = new char[2];


    char* s2 = new char[2];
   
    cin >> str1;
 
    strcpy(s, str1.c_str());
    delete [] s; //这一步可能会崩溃哦,你没有delete 本身程序就错了 
    delete []s2;
    return 0;
}


通常,一些做法会出错,并不是说,立即就会出问题;
但是这样写的程序,你敢用在项目中吗???

这种潜在的错误,如果在几千几万行代码中,到处都是,哪又怎么一点点的查找改错啊!!!
必须掐灭在萌芽状态之中,这才是杜绝这种错误的方法;

而不是验证这种错误,会不会立即出问题。

不立即出问题,就算不出问题吗????


热点排行