Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 没有足够的空间_C++_Windows_Memory_Memory Management - Fatal编程技术网

C++ 没有足够的空间

C++ 没有足够的空间,c++,windows,memory,memory-management,C++,Windows,Memory,Memory Management,Windows 7,64位,MinGW工具集,以下代码: m_data = reinterpret_cast<SampleType *>(realloc(m_data, m_size + v)); if (NULL == m_data){ perror ("realloc failed"); exit(-1); } 所以,第一次使用malloc分配内存。不要怀疑 调试器会话跟踪 Breakpoint 2, _fu17___ZSt4cout () at

Windows 7,64位,MinGW工具集,以下代码:

m_data = reinterpret_cast<SampleType *>(realloc(m_data, m_size + v));  
if (NULL == m_data){  
    perror ("realloc failed");  
    exit(-1);  
}
所以,第一次使用malloc分配内存。不要怀疑

调试器会话跟踪

Breakpoint 2, _fu17___ZSt4cout () at ../sound_windows/Sound.h:192  
192             if (NULL != m_data){  
(gdb) print *this  
$2 = {static CHANNEL_NUMBER = <optimized out>, m_format = {wFormatTag = 1, nChannels = 2,nSamplesPerSec = 44100, nAvgBytesPerSec = 176400, nBlockAlign = 4,  
    wBitsPerSample = 16, cbSize = 18}, m_duration = 0, m_data = 0x0, m_size = 0}  
(gdb) cont  
Continuing.  

Breakpoint 2, _fu17___ZSt4cout () at ../sound_windows/Sound.h:192  
192             if (NULL != m_data){  
(gdb) print *this  
$3 = {static CHANNEL_NUMBER = <optimized out>, m_format = {wFormatTag = 1, nChannels = 2,nSamplesPerSec = 44100, nAvgBytesPerSec = 176400, nBlockAlign = 4,  
    wBitsPerSample = 16, cbSize = 18}, m_duration = 0.00451559993, m_data = 0x75d9e0, m_size = 800}  
(gdb) cont  
Continuing.  
tried to allocate 800+100 bytes  
realloc failed: Not enough space  
[Inferior 1 (process 6132) exited with code 037777777777]  
我怀疑现有的m_数据没有直接分配给malloc。realloc仅重新分配最初使用malloc分配的块

这是因为它使用堆内部数据结构的知识。如果块不是来自堆,如果幸运的话,你会收到一条消息,如果不幸的话,你的程序就会崩溃

“空间不足”消息只是分配失败的一般返回

编辑:在扩展版本中,是否在构造函数中将m_数据初始化为NULL?这不会自动发生,如果不这样做,它通常会包含一个垃圾值


换句话说,如果为NULL,则分支将被删除!=m_数据{永远不会被命中,因为除非您初始化它,否则m_数据不会以NULL开头。

错误的根本原因是由于内存管理函数中的内存寻址混乱而导致堆栈破坏。例如,在下面的代码行中

memcpy (m_data + m_size, wave.SampleBuffer(), wave.DataSize()); 

m_data+m_size并不是它的本意,因为m_data指向一个两字节大小的类型,而m_size是以字节为单位的大小。所以m_data+m_size不是指向m_data的末尾,而是指向两倍远的距离。

在调试器走到那一行时,您看到的m_size+v的值是多少?您确定m_data已经分配了吗那么,到底是什么导致了“空间不足”错误呢?我只看到你通过perror报告的realloc失败了,realloc可能会因为其他原因返回NULL。如果你删除重新解释的cast,也会发生同样的情况?@KillianDS:是的,我确定m_数据已经分配。消息发生在realloc重新运行NULL之后。这就是我所知道的所有信息ave关于。m_数据是使用malloc还是其他方法分配的?realloc仅重新分配使用malloc分配的内存。好的,伙计们,请参阅初始问题中的完整代码和相应注释。@OlegG,看到什么?如果您正在编辑,请确保显示m_数据分配的位置。@OlegG,我在答案中添加了更多内容。是的,我将m_数据初始化为NULL In构造函数。已选中。@olegG,在该行上粘贴一个断点,并在调试器中检查它。
memcpy (m_data + m_size, wave.SampleBuffer(), wave.DataSize());