我已分配和对象数组
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)
强制代码编译.
我的代码中有这个:
double** desc = new double* [size_out];
for (int i = 0; i < size_out; i++)
desc[i] = new double [size_in];
Run Code Online (Sandbox Code Playgroud)
我该如何删除desc?
我应该这样做:
delete [] desc;
Run Code Online (Sandbox Code Playgroud)
要么
for (int i=0; i<size_out; i++)
delete [] desc[i];
delete [] desc;
Run Code Online (Sandbox Code Playgroud)
要么
for (int i=0; i<size_out; i++)
delete [] desc[i];
delete desc;
Run Code Online (Sandbox Code Playgroud)
?
为什么C++没有直接对应于贴图新的贴片删除,即调用析构函数并调用适当的贴片删除操作符?
例如:
MyType *p = new(arena) MyType;
...
//current technique
p->~MyType();
operator delete(p, arena);
//proposed technique
delete(arena) p;
Run Code Online (Sandbox Code Playgroud) 当我意识到我对指针有很大的误解时,我正在解决一些编程练习.请有人解释一下这段代码导致C++崩溃的原因.
#include <iostream>
int main()
{
int* someInts = new int[5];
someInts[0] = 1;
someInts[1] = 1;
std::cout << *someInts;
someInts++; //This line causes program to crash
delete[] someInts;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
PS我知道没有理由在这里使用"new",我只是尽可能地使用这个例子.
什么相当于C中的C++新/删除?
或者它在C/C++中是一样的?
int *p=(int * )malloc(sizeof(int));
delete p;
Run Code Online (Sandbox Code Playgroud)
当我们使用malloc分配内存时,我们应该使用free释放它,当我们在C++中使用new分配时,我们应该使用delete释放它.
但是如果我们使用malloc分配内存然后使用delete,那么应该会有一些错误.但是在上面的代码中,C++中没有错误或警告.
此外,如果我们使用new进行反向和分配并使用free进行释放,那么也没有错误或警告.
为什么会这样?
这是代码审查评论之一.
在为任何对象调用delete之前检查NULL是个好主意吗?
我确实理解删除运算符在内部检查NULL并且是多余的,但是提出的参数是删除,因为运算符可以重载,如果重载版本没有检查NULL,它可能会崩溃.因此,假设如果和何时删除将被重载,它是否安全合理,它将检查是否为NULL?在我的理解中,合理地假设第一种情况是重载删除应该处理NULL检查,并且审查点不成立.你怎么看?
我执行此代码时实际发生了什么?
class MyClass
{
MyClass()
{
//do something
delete this;
}
}
Run Code Online (Sandbox Code Playgroud) 这个让我想到:
class X;
void foo(X* p)
{
delete p;
}
Run Code Online (Sandbox Code Playgroud)
delete p如果我们甚至不知道是否X有可见的析构函数,我们怎么可能呢?g ++ 4.5.1给出了三个警告:
Run Code Online (Sandbox Code Playgroud)warning: possible problem detected in invocation of delete operator: warning: 'p' has incomplete type warning: forward declaration of 'struct X'
然后它说:
注意:即使在定义类时声明析构函数也不会调用析构函数或特定于类的运算符delete.
哇......像g ++一样诊断这种情况需要编译器吗?还是未定义的行为?
c++ pointers forward-declaration delete-operator incomplete-type
我一直在研究,没有任何相关的问题,所以我来到这里.
我试图避免内存泄漏,所以我想知道:
假设我有一个MyClass成员ints a和b一个类int array c,它们填充了一个成员函数:
class MyClass
{
public:
int a, b;
int c[2];
void setVariables()
{
a, b = 0;
for (int i = 0; i < 2; i++)
{
c[i] = 3;
}
}
};
int main(int argc, char* argv[])
{
MyClass* mc = new MyClass();
mc->setVariables();
delete mc;
}
Run Code Online (Sandbox Code Playgroud)
现在,我打电话后delete mc,会a,b以及所有的内容c被删除?或者我必须在析构函数中明确地做到这一点MyClass?
c++ ×10
delete-operator ×10
new-operator ×3
pointers ×3
arrays ×1
c ×1
c++11 ×1
class ×1
constructor ×1
destructor ×1
malloc ×1
member ×1
null ×1
variables ×1