正在释放的指针未在构造函数中分配 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 将为您轻松处理所有容器大小调整和内存管理。