您的位置:首页 > 其它

[008]new、delete及动态内存分配

2014-04-01 13:52 274 查看
1、new和delete都会用,这里只声明一点:

C++ 没有明确定义如何释放指向不是用 new 分配的内存地址的指针。

比如下面的代码:

#include<iostream>

using namespace std;

int main() {
int i = 1;
int *p0 = &i;
int *p1 = new int();
int *p2 = 0;

delete p0;    // Compile OK, Run Error
delete p1;    // Compile OK, Run OK
delete p2;    // Compile OK, Run OK, No meaning

return 0;
}


对于p0,编译器无法断定其是一个指向什么类型的指针,因此尽管这个语句是错误的,但是大部分编译器都能编译通过,运行时会出错。

对于p1,指向初始化后的0值,对其作delete操作是可合法的

对于p2,指针的值为0,对其作delete操作是可合法的,但是没有意义,因为C++保证:删除0值的指针是安全的。

2、对于动态内存分配,如果和容器结合起来,需要注意的是:如果指针指向动态分配生成的指针,那么delete这个指针也是不可以的

#include<iostream>
#include<vector>
#include<string>

using namespace std;

int main() {
vector<string> svec(10, "hello World");
vector<string> *pvec1 = new vector<string>(10);
vector<string> *pv1 = &svec;
vector<string> *pv2 = pvec1;

cout << svec[0] << endl;
cout << (*pvec1)[0] << endl;   // 要特别注意*pvec1的括号
cout << (*pv1)[0] << endl;
cout << (*pv2)[0] << endl;

delete pvec1;
delete pv1;                    // Compile OK, Run Error
delete pv2;                    // Compile OK, Run Error
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: