2017-10-12 105 views
-2

在C++中,我有一个类A,以及第二类B,其包含A的分配的数组什么是用于从乙删除A的一个实例的正确语法?在C++中删除动态分配的类实例?

class A 
{ 
    ~A() {/*delete members of A which were dynamically allocated*/} 
    //...members... 
}; 

class B 
{ 
    A *arrayOfA; // allocated by arrayOfA=new A[123]; 
}; 

这是我曾经尝试过,要删除的第i个实例:

// Code to delete an instance of A from B: 
// delete arrayofA[i]; // gives a compilation error, because delete requires a pointer 
delete &arrayofA[i]; // compiles, but gives a runtime error 

A的析构函数被调用,并且似乎正常运行。验证A的内存块时发生该错误(这是一个调试版本)。可能错误是由覆盖堆分配引起的,但我想确定C++语法对于我所要做的是正确的。

64位Windows 7; Visual Studio 2017 v15.3.5

+0

可能是3/5/0 – drescherjm

+2

规则'删除&arrayofA [I];'看起来非常可疑。你不想'删除[] arrayofA;'而不是?你不仅使用了错误的删除形式,而且我在这里是什么?你不能删除数组的一部分,所以对我来说没有多大意义。 – drescherjm

+2

为什么不使用矢量?或共享指针? –

回答

0

分配为new的对象应该用delete删除,而分配了new[]的对象应该删除delete[]。任何其他排列都会导致未定义的行为,也可能导致不好的事情发生。

A * a = new A(); 
delete a; 
A * b = new A[10]; 
delete[] b; 
A * c = new A[50]; 
delete c; //UB!!!! 
+0

@EdHeal [不似乎是一个编译错误](https://ideone.com/rn2OAY)。 – Xirema

+1

@EdHeal这两种语法都是有效的。 'new A()'将初始化''A'对象,'new A'将默认初始化'A'对象。没有什么区别,如果'A'是一类,但例如,如果'A'是'int',值初始化一个typedef设置'int'零和默认初始化离开'int'不确定的。 – aschepler