[008]new、delete及动态内存分配
2014-04-01 13:52
274 查看
1、new和delete都会用,这里只声明一点:
C++ 没有明确定义如何释放指向不是用 new 分配的内存地址的指针。
比如下面的代码:
对于p0,编译器无法断定其是一个指向什么类型的指针,因此尽管这个语句是错误的,但是大部分编译器都能编译通过,运行时会出错。
对于p1,指向初始化后的0值,对其作delete操作是可合法的
对于p2,指针的值为0,对其作delete操作是可合法的,但是没有意义,因为C++保证:删除0值的指针是安全的。
2、对于动态内存分配,如果和容器结合起来,需要注意的是:如果指针指向动态分配生成的指针,那么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 }
相关文章推荐
- 动态内存分配(new delete)
- 动态内存分配(new delete)
- c++动态内存分配(new/new[]和delete/delete[])
- 类和动态内存分配,类成员的动态内存分配,new,delete,定位new
- new和delete运算符用于动态分配和撤销内存的运算符
- 动态内存分配- new/delete 和malloc/free的区别
- c++中的动态内存分配(new,delete)
- new和delete运算符用于动态分配和撤销内存的运算符
- 动态内存分配(new delete)
- 程序设计实习·笔记(动态内存分配:new和delete)
- C++动态内存分配(new/new[]和delete/delete[])详解
- c/c++ 补漏之动态内存分配,malloc,free,new delete (一)
- new和delete运算符用于动态分配和撤销内存的运算符
- 动态内存分配(new)和释放(delete)
- 2017.8.21 动态分配和撤销内存的运算符new和delete
- c++:动态内存分配(new和delete的使用)
- 动态分配/撤销内存new和delete
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free