所以给出了这个简单的场景:
class A{
public:
A(){
n = new int(10);
}
~A(){
delete n;
}
int* n;
};
int main(){
A* a = new A();
}
这会导致堆损坏(一般是问题),因为一个指针还没有完成分配,而我正在进行新的分配吗?
如果是这样,在堆构造函数中使用std :: vector也是禁止的,对吧?
谢谢。
答案 0 :(得分:2)
您的a
指针已完成分配。
新作品如下(过度简化)
所以在你的情况下
这忽略了涉及例外的案件。
答案 1 :(得分:1)
没有“堆构造函数”这样的东西,不,你不能通过new
堆内对象的构造函数内的内存来破坏堆。 new A
的内存在调用A::A()
时完全分配。你正在做的是正确的,非常共同。您的构造函数需要从不关注正在构造的对象是在堆栈还是堆上分配。否则,指针和类将毫无用处。
答案 2 :(得分:1)
如果“new”抛出一个异常,则该对象未被分配(注意任何分配在“new”之前需要被释放,否则你将有一个内存浸出)..
由于构造函数无法返回错误代码,因此认为异常被用作错误系统。
myclass::myclass()
{
param1 = new type1(); //successfull
try
{
param2= new type2(); //may fail
}
(...)
{
delete param1; //need to deallocate
}
}
这有点矫枉过正,我宁愿在构造函数中没有例外,有些人使用构造函数制作整个frameorks而不是抛出异常..
无论如何,分配器中的任何其他错误都可能导致:
分段错误(访问超出范围的值)
堆损坏(覆盖内存范围内的数据但该对象不属于该对象)
无限循环(你需要在外部中止程序,否则它永远不会退出分配器)。
这些是您可以使用普通代码进行的主要问题。然而,默认分配器不会产生任何问题,至少会抛出“内存不足”异常。如果你没有足够的公羊。