【问题标题】:Pointer being freed was not allocated with realloc and malloc in construct function被释放的指针未在构造函数中分配 realloc 和 malloc
【发布时间】:2016-07-16 03:30:10
【问题描述】:

我已经尝试过dataPoolBuffer = realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize));,但 Xcode 报告:assigning to 'char *' from im compatible type 'void'。

我创建了一个类:

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 显示:当它试图释放 dataPoolBuffer 时,未在 ~solutionBuffer() 中分配被释放的指针。 为什么会这样?如何解决?

【问题讨论】:

  • 这里有这么多错的地方,我什至不知道从哪里开始:malloc,大小为0;在 C++ 代码中使用 mallocfree;首先是不必要的动态分配。名单还在继续,一直在,一直在……
  • 即使我将malloc修改为1,它仍然显示错误消息。 C++ 与 C 风格兼容。为什么不能在 C++ 中使用它
  • 我理解使用realloc的原因。但是我想知道您认为在类的构造函数中(错误地)锁定互斥锁的可能原因是什么,其中 said-same 仅修改实例成员变量。您是否期望多个线程同时构造同一个对象?或者您在我希望它被锁定的方法中忽略了所述互斥锁(但不是您的操作方式),例如您的 add 方法。如果不需要重现您的发现,请在您的帖子中删除它。
  • 关于您的实际问题,您认为reallocresultfor 吗?我认为您应该查看它返回的内容,以及为什么忽略它是一个 bad 的想法。了解realloc 的工作原理,因为您使用它错误
  • @SamVarshavchik malloc(0) 没问题

标签: c++ pointers free realloc


【解决方案1】:

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 将为您处理所有容器大小调整和内存管理,不会有任何麻烦。

【讨论】:

  • 我试过“ataPoolBuffer = realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize));”已经,但是 Xcode 报告:从不兼容的类型 'void' 分配给 'char *'。
  • @beasone 好点。我又回到了 C 上,这个插科打诨是合法的。需要额外的演员表。修复。
【解决方案2】:

当您调用realloc() 时,您需要将结果分配回指针变量。 realloc() 经常需要将内存移动到一个新的位置,它会返回那个位置。您的代码使变量指向旧位置,之后尝试使用它时会出现未定义的行为。

应该是这样的:

dataPoolBuffer = (char*)realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize));

flagBuffer = (char*)realloc(flagBuffer, sizeof(char)*(dataPoolSize));

【讨论】:

  • 我试过“ataPoolBuffer = realloc(dataPoolBuffer, sizeof(char)*(dataPoolSize));”已经,但是 Xcode 报告:从不兼容的类型 'void' 分配给 'char *'。
  • 忘记了 C++ 要求您在此处使用显式转换。
猜你喜欢
  • 1970-01-01
  • 2014-11-28
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多