【发布时间】:2023-03-15 09:41:01
【问题描述】:
我有一个大致如下所示的 c++ 类(参见下面的代码)。它有一个输入缓冲区和一个使用 std::stringbuf 的输出缓冲区。因为我还想访问原始缓冲区,所以我使用 std::stringbuf.pubsetbuf() 将底层缓冲区设置为我自己的用户定义字节数组。
一切似乎都运行良好,直到我不再需要该对象,但当该对象被破坏时,它会导致我的程序因访问冲突而崩溃。
我将其追溯到如下所示的一段代码。在我看来,stringbuf 正在以某种方式清理我的用户定义的字节数组本身?当我删除类的 destrcutor 中的代码以释放我之前在构造函数中分配的字节数组时,我的程序不会崩溃。
请问有什么建议吗?我错误地使用了 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::setbuf(这是pubsetbuf所调用的)具有实现定义的行为。您是否有针对您的具体实施的文档? -
另外,您似乎没有粘贴实际代码而是重新输入了它?并且在这个过程中对标点符号不是很小心。
-
@BenVoigt,是的,代码标签错位把我扔了:) ...编辑评论
-
@BenVoight:是的,确实,我重新输入了我的代码,因为我想让示例代码看起来尽可能干净,以便在此处阅读。没有太注意标点符号。对此感到抱歉。我已经更正了标点符号。我没有关于我的具体实现的文档。也许我可以在某个地方找到它,但现在我不知道在哪里可以找到它。
-
基类
std::streambuf的析构函数负责删除指针。
标签: c++ arrays stl buffer access-violation