一个关于c++字符串处理和delete[]与delete差别的问题
2008-08-02 16:19
856 查看
一个关于c++字符串处理和delete[]与delete差别的问题
先看下面一个字符串处理的小例子
CString str = "zhongguo";//在c++builder中CString 对应的类型AnsiString 其余一样
CString strtwo = str;//值拷贝
int *addr = (int*)&strtwo;
char*p = (char*)*addr;
*p = 'X';
AfxMessageBox(str);//cb中为 ShowMessage(str);
这时大家可以发现strtwo变成了Xhongguo这是正常的,然而再看str 却也变成了它。显然两者都是指向共同的数据区。原来,在vc和c++Builder中在处理字符串时,都进行了优化。当进行赋值操作时,并不进行真正的数据拷贝操作。而是使二者指向相同的数据区而已,并将该内存块的引用数加一。当对字符串单个操作等可能破坏其他用户的数据操作时,才检查它的引用数,以决定是否要拷贝一份数据。具体详细操作,要涉及c++Builder和 vc编译器的各自的内存管理方式了。其实这种处理技巧在许多地方随处可见。如动态链接库的调用,以及COM对象的实现等等。
还有一个是关于对数组进行delete和delete[]的差别,我认为至少在vc6.0和c++Builder5.0中(其它版本我也没有用过!),它们这两个操作时没有区别的,例如:
char * p= new char[100000];
//。。。它操作
delete p;// 和 delete p[]是等价的
我通过代码分析和例子测试两种途径,证实两者是一样的,然而我见到的所有资料上介绍都是说它们是不一样的,或许他们说的是c++标准规定,我也没有空去核查过,嘻嘻,毕竟饭碗要紧!
抛开代码分析,可以做个简单的测试。分别放两个按钮。处理代码如下:
一:
for (int i = 0 ; i < 100000 ; i++)
{
char * p= new char[100000];
delete p;
}
二:
for (int i = 0 ; i < 100000 ; i++)
{
char * p= new char[100000];
delete p[];
}
分别按下测试,可以通过任务管理器(或其他工具软件)两者的内存增加是一样的(可能是4k),这是在第一次new时系统分配的内存。这是windows内存分配委托所致的假象。都进行了内存释放!在vc下可以用CMemoryState类进行检测更方便,具体可以查看相关的msdn资料了。顺便说一下,由于vc在释放内存时,还要进行内存块清零等操作,所以在速度上远不及c++builder,就是发行版也还是无法和cb的调试版相媲美的。
先看下面一个字符串处理的小例子
CString str = "zhongguo";//在c++builder中CString 对应的类型AnsiString 其余一样
CString strtwo = str;//值拷贝
int *addr = (int*)&strtwo;
char*p = (char*)*addr;
*p = 'X';
AfxMessageBox(str);//cb中为 ShowMessage(str);
这时大家可以发现strtwo变成了Xhongguo这是正常的,然而再看str 却也变成了它。显然两者都是指向共同的数据区。原来,在vc和c++Builder中在处理字符串时,都进行了优化。当进行赋值操作时,并不进行真正的数据拷贝操作。而是使二者指向相同的数据区而已,并将该内存块的引用数加一。当对字符串单个操作等可能破坏其他用户的数据操作时,才检查它的引用数,以决定是否要拷贝一份数据。具体详细操作,要涉及c++Builder和 vc编译器的各自的内存管理方式了。其实这种处理技巧在许多地方随处可见。如动态链接库的调用,以及COM对象的实现等等。
还有一个是关于对数组进行delete和delete[]的差别,我认为至少在vc6.0和c++Builder5.0中(其它版本我也没有用过!),它们这两个操作时没有区别的,例如:
char * p= new char[100000];
//。。。它操作
delete p;// 和 delete p[]是等价的
我通过代码分析和例子测试两种途径,证实两者是一样的,然而我见到的所有资料上介绍都是说它们是不一样的,或许他们说的是c++标准规定,我也没有空去核查过,嘻嘻,毕竟饭碗要紧!
抛开代码分析,可以做个简单的测试。分别放两个按钮。处理代码如下:
一:
for (int i = 0 ; i < 100000 ; i++)
{
char * p= new char[100000];
delete p;
}
二:
for (int i = 0 ; i < 100000 ; i++)
{
char * p= new char[100000];
delete p[];
}
分别按下测试,可以通过任务管理器(或其他工具软件)两者的内存增加是一样的(可能是4k),这是在第一次new时系统分配的内存。这是windows内存分配委托所致的假象。都进行了内存释放!在vc下可以用CMemoryState类进行检测更方便,具体可以查看相关的msdn资料了。顺便说一下,由于vc在释放内存时,还要进行内存块清零等操作,所以在速度上远不及c++builder,就是发行版也还是无法和cb的调试版相媲美的。
相关文章推荐
- 关于c++字符串的一个问题
- cocos2dx使用tolua关于字符串处理的一个问题
- cocos2dx中使用的tolua关于字符串处理的一个问题
- 关于“C++ vs2010中声明一个类的函数,提示不兼容”问题
- 关于c++中new和delete的长度问题
- 关于c++中cin获取字符串的某些问题
- 关于PHP异常处理 的一个问题
- Python2和Python3之间关于字符串编码处理的差别
- 关于字符串的一个问题的解决所想到的
- 关于对象在函数中delete的一个问题
- C++中关于文字编码的问题(格式化字符串)
- VC中关于字符串处理问题小结
- 关于c和c++中的eof函数多读一个问题
- [noip][c/c++]关于字符串中前导0和后导0的处理算法
- 将一个十六进制字符串转换为十进制数值的问题|| 以及C++中string转换成char*|| c++文件按行输入
- 遇见的又一个新问题,关于显示文章条目的时候,显示宽度的处理
- 【转载】一个关于VC++6.0与标准C++差异处理的小技巧
- 批处理关于截取变量中字符串(字段)问题的详细说明(转)
- C++ 一个关于返回参数的问题
- C++用纯字符串来处理高精度问题代码