c++ - 智能指针无法释放内存

标签 c++ pointers memory smart-pointers

<分区>

我的智能指针实现如下所示,它不会在异常时释放内存..

template <class T>
class SMARTPOINTER
{
public:
   SMARTPOINTER(T* pointee) : SMART_POINTEE(pointee) {
    cout <<"\n Inside class SMARTPOINTER CONSTURCTOR \n";
   }

   ~SMARTPOINTER() {
     cout <<"\n Inside class SMARTPOINTER DESTRUCTOR \n";
      delete SMART_POINTEE;
   }

   T& operator*() const
   {
      cout <<"\n Inside class SMARTPOINTER operator* \n";
      return *SMART_POINTEE;
   }

   T* operator->() const
   {
      cout <<"\n Inside class SMARTPOINTER operator->()  \n";
      return SMART_POINTEE;
   }

private:
   T* SMART_POINTEE;

};

class Widget
{
public:

  Widget() {
      cout <<"\n Inside Widget CONSTRUCTOR \n";
  }

   void Fun() { 
     cout <<"\n Inside Widget::Fun() \n";
   }

  ~Widget() {
      cout <<"\n Inside Widget DESTRUCTOR \n";
  }

};

class THROWME{

};

int main() {

SMARTPOINTER<Widget> sp(new Widget);
sp->Fun();
throw new THROWME;
(*sp).Fun();

return 0 ;
}

我发现输出是

Inside Widget CONSTRUCTOR 

 Inside class SMARTPOINTER CONSTURCTOR 

 Inside class SMARTPOINTER operator->()  

 Inside Widget::Fun() 
uncaught exception of type THROWME*
Aborted.

据我所知,智能指针应该可以在这种情况下帮助我!!我没有发现通过智能指针调用 Widget 的破坏。

所以我一定是在这里遗漏了一些实现。

阅读评论后编辑

通过 try catch 我得到了我的结果。但我仍然不知道它是否正确的做法 代码更改

  int main() {
        try {
        SMARTPOINTER<Widget> sp(new Widget);
        sp->Fun();
        THROWME tm;
        throw tm;
        (*sp).Fun();
        }
        catch(...) {
          cout <<"\n **SOME EXCEPTION CAUGHT**  \n";
        }
        return 0 ;
        }

结果

 Inside Widget CONSTRUCTOR 

 Inside class SMARTPOINTER CONSTURCTOR 

 Inside class SMARTPOINTER operator->()  

 Inside Widget::Fun() 

 Inside class SMARTPOINTER DESTRUCTOR 

 Inside Widget DESTRUCTOR 

 **SOME EXCEPTION CAUGHT**

最佳答案

析构函数未被调用,因为未处理的异常 THROWME 导致 std::terminate 被调用。另见 this question ,特别是已接受答案中的第一条引文:

C++11 15.2 Constructors and destructors [except.ctor]

1 As control passes from a throw-expression to a handler, destructors are invoked for all automatic objects constructed since the try block was entered. The automatic objects are destroyed in the reverse order of the completion of their construction.

由于您没有 try block 来处理异常,因此不会调用析构函数。

关于c++ - 智能指针无法释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16870789/

相关文章:

c++ - 从 Complex* 到 double 的无效转换

.net - 在 .NET 中使用 C++/CLI 实用程序 :

c++ - GLUT 纹理人工制品

Java 使用的内存多于分配的内存

java - 什么可能导致 JVM 崩溃并显示 SIGSEGV "ClassLoaderData::metaspace_non_null()"

c++ - 如果模板参数是函数指针

c++ - "xxx.exe is not a valid Win32 application"在 VS 刚刚构建之后

c++ - Sublime Text 2 能否像 Eclipse 一样重新格式化 C++?

pointers - Go 中的指针解除引用是如何工作的?

java - 在Java进程之间共享核心库