Mat*_*att 0 c++ malloc realloc
所以我在我的程序中使用malloc然后在程序内部的方法中重新分配.在我多次调用这个方法之后,我会得到一个"Segmentation fault(core dumped)".
经过进一步检查,我意识到由于某种原因,当我的指针从0x25d7d60或0x223fae0(或任何由7位数字(0xHHHHHHH)表示的地址)变为0x7f47d370a010(超过7位数)时,会从realloc调用中抛出一个段错误,realloc甚至不会返回NULL.我通过简单地使用malloc然后使用memcpy来修复此问题.但是我很困惑,为什么会发生这种情况,并希望看看stackoverflow的任何用户是否能够解释为什么会发生这种情况.
谢谢
这是相关代码:
unsigned int* myArray;
unsigned int num_ints;
int main()
{
num_ints = 100;
if((myArray =(unsigned int*) malloc(sizeof(unsigned int)*(num_ints)*3))==NULL)
{
std::cout << "Malloc failed!" << std::endl;
return false;
}
.
.
.
//This called when n key is pressed (code left out)
methodName();
return true;
}
void methodName()
{
if((myArray =(unsigned int*) realloc(myArray,sizeof(unsigned int)*(num_ints*4)*3))==NULL)
{
std::cout << "Realloc failed!" << std::endl;
exit(0);
}
}
Run Code Online (Sandbox Code Playgroud)
通过在程序内部的方法中调用"realloc",很有可能实际上将它加载到一个局部变量中,然后将其丢弃并且程序继续使用旧指针(现在已被释放).
我们需要看到代码是确定的,但根据我的经验,这是分配错误的主要原因之一.
根据你所展示的内容,你所做的事情没有任何问题.它实际上与此代码相同:
#include <iostream>
#include <cstdlib>
int sz = 1000;
int *buffer = 0;
static int methodName (void) {
if (sz == 100000)
sz = 100;
sz = sz * 10;
if ((buffer = (int*)realloc (buffer, sz)) == 0) {
std::cout << "Realloc error" << std::endl;
return 1;
}
return 0;
}
int main(void) {
int i;
if ((buffer = (int*)malloc (sz)) == 0) {
std::cout << "Alloc error" << std::endl;
return 1;
}
for (i = 0; i < 10000000; i++)
if (methodName() != 0)
return 1;
std::cout << "All okay" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这完美地工作,做了一千万次重新分配.
所以问题出在你向我们展示的内容之外,可能是编译器错误(如果你使用的是主流编译器,则非常不可能)或代码中其他地方的内存损坏.