作为一个试图理解智能指针的C ++新手。我写了下面的代码来检查。
它确实编译并运行但我期望调用我的类的析构函数并从析构函数中打印cout但它没有。
我们是否需要重载用户定义类中的任何函数,以便在该类的smart_ptr对象被销毁时调用其析构函数。
为什么它没有调用对象析构函数。我错过了什么?
#include <iostream>
#include <cstdlib>
#include <tr1/memory>
#include <string>
//using namespace std;
class myclass
{
public:
myclass();
myclass(int);
~myclass();
private:
int *ptr;
std::string *cptr;
};
myclass::myclass()
{
std::cout << "Inside default constructor\n";
}
myclass::myclass(int a)
{
std::cout << "Inside user defined constructor\n" ;
ptr = new int[10];
cptr = new std::string("AD");
}
myclass::~myclass()
{
std::cout << "Inside destructor..\n";
delete [] ptr;
delete cptr;
std::cout << "Freed memory..\n";
}
int main()
{
int i;
std::cin >> i;
std::tr1::shared_ptr<std::string> smartstr(new std::string);
std::tr1::shared_ptr<myclass> smart_a(new myclass(i));
if(i == 0)
{
std::cout << "Exiting...\n";
exit(-1);
}
}
答案 0 :(得分:11)
永远不会销毁对象的原因是因为您通过调用exit
退出程序。这导致程序在智能指针对象有机会超出范围之前退出,因此它们管理的对象永远不会被销毁。由于您在main
中,因此请使用return语句,而不是调用exit
。
答案 1 :(得分:4)
而且,作为其他答案的附加信息,请参阅标准:
按§3.6.1/ 4:
在不离开当前块的情况下终止程序(例如,通过 调用函数
std::exit(int)
(18.5))不会破坏任何函数 具有自动存储持续时间的对象(12.4)。
答案 2 :(得分:2)
在下面的代码中,
if(i == 0)
{
std::cout << "Exiting...\n";
exit(-1);
}
您正在通过调用exit()
来终止程序,因此该对象永远不会被销毁。因此,请从代码中删除exit(-1);
。
答案 3 :(得分:-1)
一种可能的解决方案是确保在析构函数中刷新缓冲区。在析构函数中使用std::endl;
。有关详细信息,请查看此处:Buffer Flushing, Stack Overflow