正在释放的指针未在构造函数中分配 realloc 和 malloc
Pointer being freed was not allocated with realloc and malloc in construct function
我已经尝试 dataPoolBuffer = realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize));
,但是 Xcode reports:assigning 到 'char *' 来自不兼容的类型 'void'.
我创建一个 class:
class solutionBuffer{
private:
char * dataPoolBuffer;
char * consumerBuffer;
char * flagBuffer;
int dataPoolSize;
int consumerBufferSize;
mutex safe;
public:
solutionBuffer(){
safe.lock();
dataPoolSize = 0;
consumerBufferSize = 0;
dataPoolBuffer = (char*)malloc(sizeof(char)*1);
consumerBuffer = (char*)malloc(sizeof(char)*1);
flagBuffer = (char*)malloc(sizeof(char)*1);
}
int add(char* data, int length)
{
dataPoolSize += length;
realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize));
realloc(flagBuffer, sizeof(char)*(dataPoolSize));
memcpy(dataPoolBuffer + dataPoolSize - length, data, sizeof(char)*(length));
return 0;
}
~solutionBuffer(){
printf("%d",strlen(dataPoolBuffer));
free(dataPoolBuffer);
free(consumerBuffer);
free(flagBuffer);
safe.unlock();
}
};
每次我们调用.add
函数的时候,都会realloc
内存变量。但是,当我在 main()
:
中这样做时
char data[] = "0123456789";
char data2[] = "01234567890123456789";
solutionBuffer buffer;
buffer.add(data, 10);
buffer.add(data2, 20);
正在释放的 xoce shows:pointer 在尝试释放 dataPoolBuffer
时未在 ~solutionBuffer()
中分配。
为什么它会那样?如何解决?
调用realloc()
时,需要将结果赋值回指针变量。 realloc()
经常需要将内存移动到一个新的位置,它 returns 那个位置。您的代码使变量指向旧位置,之后您尝试使用它时会出现未定义的行为。
所以应该是:
dataPoolBuffer = (char*)realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize));
flagBuffer = (char*)realloc(flagBuffer, sizeof(char)*(dataPoolSize));
According to the documentation、
realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize));
重新分配 dataPoolBuffer
,但不更改 dataPoolBuffer
点的位置。所以 dataPoolBuffer
现在指向无效内存的可能性很大。
dataPoolBuffer = (char*)realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize));
会做你想做的事,但要重新考虑你是如何做的。你让自己承受很多痛苦。 Your class violates The Rule of Three, for one thing. std::vector 将为您轻松处理所有容器大小调整和内存管理。
我已经尝试 dataPoolBuffer = realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize));
,但是 Xcode reports:assigning 到 'char *' 来自不兼容的类型 'void'.
我创建一个 class:
class solutionBuffer{
private:
char * dataPoolBuffer;
char * consumerBuffer;
char * flagBuffer;
int dataPoolSize;
int consumerBufferSize;
mutex safe;
public:
solutionBuffer(){
safe.lock();
dataPoolSize = 0;
consumerBufferSize = 0;
dataPoolBuffer = (char*)malloc(sizeof(char)*1);
consumerBuffer = (char*)malloc(sizeof(char)*1);
flagBuffer = (char*)malloc(sizeof(char)*1);
}
int add(char* data, int length)
{
dataPoolSize += length;
realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize));
realloc(flagBuffer, sizeof(char)*(dataPoolSize));
memcpy(dataPoolBuffer + dataPoolSize - length, data, sizeof(char)*(length));
return 0;
}
~solutionBuffer(){
printf("%d",strlen(dataPoolBuffer));
free(dataPoolBuffer);
free(consumerBuffer);
free(flagBuffer);
safe.unlock();
}
};
每次我们调用.add
函数的时候,都会realloc
内存变量。但是,当我在 main()
:
char data[] = "0123456789";
char data2[] = "01234567890123456789";
solutionBuffer buffer;
buffer.add(data, 10);
buffer.add(data2, 20);
正在释放的 xoce shows:pointer 在尝试释放 dataPoolBuffer
时未在 ~solutionBuffer()
中分配。
为什么它会那样?如何解决?
调用realloc()
时,需要将结果赋值回指针变量。 realloc()
经常需要将内存移动到一个新的位置,它 returns 那个位置。您的代码使变量指向旧位置,之后您尝试使用它时会出现未定义的行为。
所以应该是:
dataPoolBuffer = (char*)realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize));
flagBuffer = (char*)realloc(flagBuffer, sizeof(char)*(dataPoolSize));
According to the documentation、
realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize));
重新分配 dataPoolBuffer
,但不更改 dataPoolBuffer
点的位置。所以 dataPoolBuffer
现在指向无效内存的可能性很大。
dataPoolBuffer = (char*)realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize));
会做你想做的事,但要重新考虑你是如何做的。你让自己承受很多痛苦。 Your class violates The Rule of Three, for one thing. std::vector 将为您轻松处理所有容器大小调整和内存管理。