因此,考虑这个简单的场景:
class A{
public:
A(){
n = new int(10);
}
~A(){
delete n;
}
int* n;
};
int main(){
A* a = new A();
}
可这个原因堆损坏(一般问题),因为指针没有完成分配,而我正在做新的分配?
如果是这样,使用堆构造内的std ::载体,也是禁止的,对不对?
谢谢。
因此,考虑这个简单的场景:
class A{
public:
A(){
n = new int(10);
}
~A(){
delete n;
}
int* n;
};
int main(){
A* a = new A();
}
可这个原因堆损坏(一般问题),因为指针没有完成分配,而我正在做新的分配?
如果是这样,使用堆构造内的std ::载体,也是禁止的,对不对?
谢谢。
你的a
指针已完成分配 。
新作如下(简单化)
所以你的情况
这忽略涉及例外情况..
没有所谓的“堆构造”没有这样的事,没有,你不能破坏堆通过new
上堆对象的构造函数中ING内存。 对于存储new A
在时间全部分配给A::A()
被调用。 你在做什么是正确和非常普遍的。 你需要的构造从来没有被构造的对象是否在栈或堆上分配有关。 否则,指针和类将是相当无用的。
如果“新”抛出一个异常,那么对象未分配(注意之前的“新”的任何分配需要在其他释放你就会有一个内存浸出)..
例外情况鑫卡特用作误差系统,因为构造函数不能返回一个错误代码。
myclass::myclass()
{
param1 = new type1(); //successfull
try
{
param2= new type2(); //may fail
}
(...)
{
delete param1; //need to deallocate
}
}
这是一个有点矫枉过正,我更喜欢有在所有构造函数没有例外,有些人让整个frameorks与构造比可以抛出异常..
反正在分配任何其他错误可能导致:
段故障(访问外的范围值)
堆损坏(覆写在存储器范围的数据,但没有被tecnically资bythe对象)
无限循环(您需要外部中止程序,否则将永远退出分配器)。
这些都是电源问题,你也可以有,当然正常的代码。 默认分配但不会给予任何问题,至少可以抛出一个“内存不足”异常。 如果你没有足够的RAM。