gpt4 book ai didi

c++ - 尝试解除分配 char 数组 : _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 的指针时出错

转载 作者:太空宇宙 更新时间:2023-11-04 11:36:16 25 4
gpt4 key购买 nike

我正在编写一个使用 Boost.Asio 发送和接收图像的 C++ 程序。

编译时我没有收到错误,但在执行并发送图像时,接收图像的程序崩溃并给出以下错误消息(在 Visual Studio 2012、Windows 7 32 位中):

Debug Assertion Failed:

Program: […]\DataSender.exe
File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgdel.cpp
Line: 52

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

我将 4096 字节大小的包读取到一个指向 char 数组的指针中,同时还有要读取的传入字节。在最后的循环中——如果要读取的字节少于 4096 个——我删除指针并创建一个指向 char 数组的指针,其大小为剩余字节的大小。直到这里它仍然有效。

但是当我尝试在循环结束时再次删除 char 指针数组(以便为下一个传入图像创建一个标准大小为 4096 的新 char 指针数组)时,程序崩溃了。

这是我的代码的问题摘录:

char* buffer = new char[4096];

[…]

int remainingBytes = imageSize;

[…]

// read data
while( remainingBytes > 0 )
{
boost::system::error_code error;

// use smaller buffer if remaining bytes don't fill the tcp package
// fully
if( remainingBytes < 4096 )
{
delete[] buffer; // this one doesn't give an error
bufferSize = remainingBytes;
char* buffer = new char[bufferSize];
}

// read from socket into buffer
size_t receivedBytes = socket.read_some(
boost::asio::buffer(buffer, bufferSize), error);
remainingBytes -= receivedBytes;

// count total length
totalReceivedBytes += receivedBytes;

// add current buffer to totalBuffer
for( int i = 0; i < bufferSize; i++)
{
totalBuffer.push_back(buffer[i]);
}

// if smaller buffer has been used delete it and
// create usual tcp buffer again
if( receivedBytes < 4096 )
{
delete[] buffer; // here the error occurs
bufferSize = 4096;
char* buffer = new char[bufferSize];
}
}

我也在 Debian GNU/Linux 7.2 64 位机器上运行了相同的代码,它在代码的相同位置返回了以下错误:

*** glibc detected *** ./datasender: double free or corruption (!prev): 0x0000000002503970 ***

我假设我在释放 char 指针数组时做错了什么,但我还没有弄清楚。

有人能指出我正确的方向吗?

最佳答案

remainingBytesreceivedBytes 小于 4096 时,您实际上删除了两倍的缓冲区。

确实,您要删除一次buffer,然后将内存分配到本地buffer,而不是外部的

然后,当您在第二个 if block 中删除 buffer 时,您将第二次删除同一个缓冲区。您在 if 范围内所做的分配是内存泄漏。这些不是相同的变量。

当你这样做的时候

char* buffer = new char[bufferSize];

在您的 if 作用域中,您正在创建一个新变量,而不是将内存分配到外部 buffer 变量中。因此,您正在泄漏,而不是将内存分配到您刚刚删除的缓冲区中。

无需进一步查看,您应该删除两个 if block 中 buffer 前面的 char*,然后继续调试。

关于c++ - 尝试解除分配 char 数组 : _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 的指针时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22992444/

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