gpt4 book ai didi

c++ - 类成员中的动态内存使用

转载 作者:行者123 更新时间:2023-11-28 01:12:12 25 4
gpt4 key购买 nike

我的一个类(class)成员有一些奇怪的行为,这真的让我陷入困境,但我肯定没有看到这个问题(漫长的一周!)

void MyFakeStringClass::readStream( iostream& nInputStream )
{
// Hold the string size
UINT32 size = 0;

// Read the size from the stream
nInputStream.read( reinterpret_cast< char* >( &size ), sizeof( UINT32 ) );

// Create a new buffer
char* buffer = new char[ size ];

// Read the stream
nInputStream.read( buffer, size );

// Save to class member
value = string( buffer );

// Clean up
delete[] buffer;
buffer = NULL;
}

当我使用两个或多个 MyFakeStringClass 时会出现此问题。 buffer 不知何故仍然包含以前调用 MyFakeStringClass::readStream 的数据。

例如,我读入两个字符串“HelloWorld”、“Test”,结果 MyFakeStringClass 对象包含“HelloWorld”和“TestoWorld”(应该是“HelloWorld”、“Test”)。

第二次访问该函数时,buffer 仍包含“旧”内存。这怎么可能,因为它是本地范围和删除的?我已经确认 buffer 正在以某种方式与调试器共享。

最佳答案

new char 不初始化内存。它将填充上次使用时留在该内存中的任何随机数据。

如果在对 readStream 的两次调用之间没有其他内存分配,您很可能会得到一个从相同地址开始的缓冲区。

就是说,你有一个错误,缓冲区不是 0 终止的,你正在使用的构造函数假定它是。您很幸运,没有遇到很多其他问题。

可以使用指定长度的构造函数:

value = string( buffer, size );

或者,如果您需要将缓冲区用于绝对需要 0 终止缓冲区的内容,您也可以将代码更改为:

// Create a new buffer
char* buffer = new char[ size + 1];

// Read the stream
nInputStream.read( buffer, size );

// Add the 0 termination to the end of the string
buffer[size] = '\0';

关于c++ - 类成员中的动态内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2217918/

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