realloc:空间不够
realloc: Not enough space
Windows 7,64位,MinGW工具集,以下代码:
m_data = reinterpret_cast<SampleType *>(realloc(m_data, m_size + v));
if (NULL == m_data){
perror ("realloc failed");
exit(-1);
}
失败并显示消息realloc failed: Not enough space
即使我多问 100 个字节,也会发生这种情况。无论我使用 malloc(带有相应的指针重新分配)还是 realloc。我总是得到相同的。
计算机报告超过 1GB 的可用内存。
以上是该方法的片段。下面是它的完整代码。
关键是,当该方法m_data等于 NULL
时this
此方法首次分配内存,并在余量调用中将其放大。所以,请看下面
Wave & operator+= (const Wave wave){
if (NULL != m_data){
m_data = reinterpret_cast<SampleType *>(realloc(m_data, m_size + wave.DataSize()));
if (NULL == m_data){
perror ("realloc failed");
exit(-1);
}
} else {
m_data = reinterpret_cast<SampleType *>(malloc(wave.DataSize()));
m_size = 0; // just for sure
}
/* this code fragment I used instead of realloc's one to prove that realloc is not a root of error cause
SampleType *t_buf = reinterpret_cast<SampleType *>(malloc(m_size + wave.DataSize()));
if (!t_buf) {perror ("malloc failed"); exit(-1);}
memcpy (t_buf, m_data, m_size);
free (m_data);
m_data = t_buf;
*/
memcpy (m_data + m_size, wave.SampleBuffer(), wave.DataSize());
m_size += wave.DataSize();
return *this;
};
因此,在第一次使用 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]
错误的根本原因是由于内存管理函数中的内存寻址混乱而发生的堆栈破坏。例如,在下面的代码行中
memcpy (m_data + m_size, wave.SampleBuffer(), wave.DataSize());
m_data + m_size
的意思不是它的意图,因为m_data
指向双字节大小类型,而m_size
是以字节为单位的大小。因此m_data + m_size
偏移到m_data
的尽头,而是偏移到两倍的距离。
我怀疑现有的m_data
没有直接分配给malloc
。 realloc
仅重新分配最初分配的块 malloc
。
这是因为它使用堆的内部数据结构的知识。如果块不是来自堆,如果你幸运的话,你会得到一条消息,如果你不走运,你的程序就会崩溃。
"空间不足"消息只是分配失败的一般返回。
编辑:
在扩展版本中,您是否将m_data
初始化为在构造函数中NULL
?这不会自动发生,如果您不这样做,它通常会包含垃圾值。
换句话说,分支if (NULL != m_data){
永远不会被命中,因为除非您初始化它,否则m_data不会以NULL
开始。
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- OpenGL相机和相机空间转型的困惑
- CUDA内核和数学函数的显式命名空间
- 打印第二列时的2d字符矢量打印空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 为什么 openmp 的并行不适用于矢量化色彩空间转换?
- 是否可以将函数导入命名空间,但不能导出它?
- realloc:空间不够