c++ - 破坏 std::stringbuf 导致访问冲突

标签 c++ arrays stl buffer access-violation

我有一个大致如下所示的 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只要该对象存在,您就授予该对象使用该缓冲区的权限,或者直到您再次更改其缓冲区。

看看你的析构函数,你没有信守 promise 。

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/

相关文章:

arrays - R中的字符串数组组合

javascript - JQuery 从数组中删除特定元素

c++ - 具有来自 STL 的 vector 、列表或映射作为成员的类是否需要复制构造函数

c++ - 寻找线性方程组的解集?

c++ - 什么使某些东西成为 C++ 中的抽象类

c++ - SetThreadAffinityMask 用法

c++ - 如何管理和组织动态和静态几何

javascript - 比较两个对象数组并将具有匹配值的对象添加到第一个对象数组

c++ - 用单循环迭代多个 map

c++ - 带有移动端的前向迭代器()