osg*_*sgx 31 c++ arrays new-operator delete-operator
我已分配和对象数组
Objects *array = new Objects[N];
Run Code Online (Sandbox Code Playgroud)
我该如何删除这个数组?只是
delete[] array;
Run Code Online (Sandbox Code Playgroud)
或者迭代数组的元素?
for(int i=0;i<N;i++)
delete array[i];
delete[];
Run Code Online (Sandbox Code Playgroud)
谢谢
更新:
我改变了循环体
delete &array[i];
Run Code Online (Sandbox Code Playgroud)
强制代码编译.
jam*_*lin 44
每次使用都new应该用a来平衡delete,每次使用new[]都要平衡delete[].
for(int i=0;i<N;i++)
delete array[i];
delete[] array;
Run Code Online (Sandbox Code Playgroud)
只有在将数组初始化为:
Objects **array = new Objects*[N];
for (int i = 0; i < N; i++) {
array[i] = new Object;
}
Run Code Online (Sandbox Code Playgroud)
您的原始代码给出了编译错误的事实强烈暗示您做错了什么.
BTW,强制性的:避免分配数组new[]; 使用std::vector,然后它的析构函数将为您清理.此外,如果抛出异常,则不会泄漏内存,因此它将是异常安全的.
sth*_*sth 13
作为一般规则,你应该delete/ delete[]确切地说你用new/ 分配的东西new[].在这种情况下,你有一个分配new[],所以你应该使用一个调用来delete[]再次释放分配的东西.
deletefor循环中的s不会编译也很好地表明它们不是正确的方法.
不仅如此
delete [] array;
Run Code Online (Sandbox Code Playgroud)
够了,但如果你这样做的话
for(int i=0;i<N;i++)
delete &array[i];
delete[] array;
Run Code Online (Sandbox Code Playgroud)
你会导致未定义的行为,因为
delete &array[i];
Run Code Online (Sandbox Code Playgroud)
将删除操作未返回的内容new.
更不用说后续delete[] array;将为析构函数调用所有在循环中调用析构函数的对象.
所以不要这样做.
| 归档时间: |
|
| 查看次数: |
88419 次 |
| 最近记录: |