class Base
{
private:
int nID;
friend int fnDeleteBase(Base* base);
public:
Base( int baseID):nID(baseID) { cout << "Base Constructed with value" << endl; }
Base () : nID(5){cout << "Base Constructed WITHOUT value" << endl; }
~Base() { cout << "Base class object killed " << endl; }
};
int fnDeleteBase(Base* base) // Line 1
{
delete base; // Line 2 - important
cout << "Base object deleted " << endl;
return (1);
}
int main()
{
Base aBase; // Line 3
try
{
int i = fnDeleteBase(&aBase); // Line 4
}
catch(...)
{
cout << "Exception handled " << endl;
}
return (0);
}
我正在调试上面的代码片段。我无法进入第2行,我将删除基础对象。一旦我尝试进入或跳过第2行,控制就会开始,我必须终止调试或执行
我得到的输出是:
Base Constructed (any of the construction is valid)
Base class Object killed
但是,如果第3行更改为Base * aBase = new Base();
,一切正常。控制台上的输出是:
Base Constructed (any of the construction is valid)
Base class Object killed
Base object Deleted
有人可以分享两者背后的技术细节吗?
答案 0 :(得分:4)
你应该 对使用delete
构建的指针(或指向使用new
构建的其他指针的指针)使用new
,没有例外(我知道)。
在其他任何事情上使用delete
(在第一种情况下会发生这种情况,因为fnDeleteBase
的参数是指向Base aBase
的指针,它不是指针而且没有指针new
关键字导致未定义的行为。
解释编译器究竟做了什么并不会有用,因为对于未定义的行为,这可能因编译器而异。应该不惜一切代价避免它。