如何在构造函数的参数中分配的对象上调用delete

She*_*der 0 c++ memory-leaks

我有两个类,一个继承自ostream,另一个继承自streambuf,这就是我使用它们的方式

int main () {
   stampstream ss(8,10);
}
Run Code Online (Sandbox Code Playgroud)

Stampstream

stampstream::stampstream(int r, int c) : ostream(new stampbuf(r,c))
{
   std::cout << "I am in stampstream" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我只是调用父(ostream)类ctor并在参数中创建一个stampbuf类的对象.

Stampbuf

stampbuf::stampbuf(int r, int c)
: _row(0), _column(0), BUFFER_SIZE(10), _buffer(new char[BUFFER_SIZE]) 
{ //some code }
Run Code Online (Sandbox Code Playgroud)

所以当我在我的项目上运行Valgrind时,它说我有106字节的内存泄漏.其中96个来自new stampbuf(r,c),10个来自_buffer(new char[BUFFER_SIZE])

我有stampbuf它调用析构函数delete_buffer释放内存.然而,析构函数永远不会被调用.如何摆脱这个内存泄漏并调用析构函数来设置stampbuf?

编辑

class stampstream : public ostream {

public:
stampstream(int r, int c);
virtual ~stampstream();
};

class stampbuf : public streambuf {

 public:
stampbuf(int r, int c);
~stampbuf();
virtual int overflow(int ch);
    };
Run Code Online (Sandbox Code Playgroud)

Luc*_*ore 5

你需要打电话

delete ostream;
Run Code Online (Sandbox Code Playgroud)

在析构函数stampstream

delete[] _buffer;
Run Code Online (Sandbox Code Playgroud)

在析构函数中stampbuf.

你最好不要使用std::unique_ptrfor ostream,std::vectorfor_buffer,而且你不需要担心内存管理.另外,ostream是一个名字std,我建议你在它为时已晚之前重命名你的变量.