gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:19:14 26 4
gpt4 key购买 nike

我有一个大致如下所示的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com