我有两个类,一个继承自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)
你需要打电话
delete ostream;
Run Code Online (Sandbox Code Playgroud)
在析构函数stampstream
和
delete[] _buffer;
Run Code Online (Sandbox Code Playgroud)
在析构函数中stampbuf
.
你最好不要使用std::unique_ptr
for ostream
,std::vector
for_buffer
,而且你不需要担心内存管理.另外,ostream
是一个名字std
,我建议你在它为时已晚之前重命名你的变量.