正如我已经读到的那样,如果我们通过指针创建对象,它就不会自动删除。但是当我用指针调用成员函数时给出错误
#include <iostream>
using namespace std;
class Base
{
protected:
int i;
public:
Base(){}
Base(int a) { i = a; }
virtual void display()
{ cout << "I am Base class object, i = " << i << endl; }
~Base(){
cout<<"tsp";
}
};
int main()
{
//Base b(33);
{
Base *u=new Base() ;
}
u->display();
//delete u;
return 0;
}
O / P:&#39; U&#39;没有在这个范围内声明,但仍然存在记忆
答案 0 :(得分:2)
指针未被删除,但u
在声明结束的块时超出范围; u
仅在该区块内可用。因此,调用u->display()
是一个错误,因为范围内不再有u
变量。
请注意,因为它没有被自动删除(超出范围与被删除的相同),您正在泄漏Base
对象分配的内存
换句话说,u
指向Base
对象,但它本身不是对象。指针可以消失,但对象仍然可以存在。就好像我有一张名片并把它扔掉了。他们的电话号码或电子邮件地址不会因为我扔掉它的记录而不再存在。
&#34; u
超出范围&#34;扔掉了名片。
&#34; delete u
&#34;是的...我想是断开名片上的电话线。
使用智能指针将此与以下代码进行对比:
int main() {
std::cout << "top\n";
{
std::unique_ptr<Base> u{new Base()};
}
std::cout << "bottom\n";
}
在这种情况下,当u
超出范围时,智能指针将被销毁,Base
分配 将被释放(您将看到输出{{ 1}}在看到输出tsp
)之前。