我有一个大致像这样的c ++类(请参见下面的代码)。它具有使用std :: stringbuf的输入缓冲区和输出缓冲区。因为我也想访问原始缓冲区,所以我使用std :: stringbuf.pubsetbuf()用我自己的用户定义的字节数组设置基础缓冲区。

一切似乎都正常,直到我不再需要该对象,但是当该对象被破坏时,它导致我的程序因访问冲突而崩溃。

我将其追溯到如下所示的代码段。在我看来,stringbuf某种程度上正在清理用户定义的字节数组本身?当我删除类的析构函数中的代码以释放先前在构造函数中分配的字节数组时,程序不会崩溃。

有什么建议吗?我在错误地使用std :: stringbuf吗?我正在使用Borland 5.0编译器(我知道它是一个非常老旧且过时的编译器,但是我不得不坚持使用一段时间。)

class SomeClass {

private:

    char *mIBuf;
    char *mOBuf;

    std::stringbuf mIBufStream;
    std::stringbuf mOBufStream;

public:

    SomeClass(int iBufSize, int oBufSize) :
      mIBuf(), mOBuf(),
      mIBufStream(), mOBufStream()
    {
        mIBuf = (char*)malloc(iBufSize);
        mOBuf = (char*)malloc(oBufSize);

        mIBufStream.pubsetbuf(mIBuf, iBufSize);
        mIBufStream.pubseekpos(0);

        mOBufStream.pubsetbuf(mOBuf, oBufSize);
        mOBufStream.pubseekpos(0);
    }

    virtual ~SomeClass()
    {
        free(mIBuf);
        free(mOBuf)
    }

};

最佳答案

根据标准,stringbuf没有自己的析构函数,并且streambuf的析构函数不执行任何操作。您的旧编译器和库可能会或可能不会遵循;有证据表明事实并非如此。

好吧,原则上您在做错事。调用pubsetbuf时,您授予该对象使用该缓冲区的权限,直到该对象存在,或者直到您再次更改其缓冲区为止。

看着你的破坏者,你并没有站在讨价还价的一边。

virtual ~SomeClass()
{
    free(mIBuf);
    free(mOBuf); // <- missing semicolon in your code

    // the stringbuf objects are still alive here
}   // they get automatically destroyed here


一种选择是安排stringbuf对象在释放缓冲区之前被销毁(char*缓冲区的重新分配将需要由帮助程序类(基类或在stringbuf之前声明的成员)完成- std::vector<char>是个不错的选择)。

或者,您可以让stringbuf知道您正在撤销其使用内存的权限:

virtual ~SomeClass()
{
    mIBufStream.pubsetbuf(0, 0);
    mOBufStream.pubsetbuf(0, 0);

    // the stringbufs cannot use your memory any longer

    free(mIBuf);
    free(mOBuf);
}

关于c++ - 破坏std::stringbuf导致访问冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29594058/

10-11 18:40