【问题标题】:Pointer being freed was not allocated problem with ALL objects!所有对象都没有分配指针被释放的问题!
【发布时间】:2011-09-15 08:08:07
【问题描述】:

我正在(至少尝试...)一个 Cocoa 应用程序,该应用程序使用多个自定义 Cocoa 框架,其中一个框架是 Cocoa 的混合strong>C++ 和 Objective C++(主要是 C++)代码...问题是这个框架内的每个内存释放都给了我 指针freed 未分配错误,即使在以下琐碎的情况下:

class testClass
{
public:
    testClass() { }
    virtual ~testClass() { }
};

void test()
{
    testClass *p = new testClass();
    delete p;
    // malloc: *** error for object 0x2800510: pointer being freed was not allocated
    //*** set a breakpoint in malloc_error_break to debug
    p = NULL;
}


ma​​lloc_error_break 告诉我对象的析构函数正在被调用,但是每次下一次分配都会增加对象的地址,所以内存实际上并没有被释放.. . 请告诉我,为什么?!

我必须使用 Mac OS X 10.6.0XCode 3.2.1Apple GCC 4.2.1

【问题讨论】:

  • 下一次分配增加对象的地址这是什么意思?
  • 如果我连续进行 3 次分配/解除分配,我会得到以下错误:对象 0x2800510 错误,对象 0x2800520 错误,对象 0x2800530 错误...
  • 下一次分配发生在不同地址的事实本身并不意味着内存没有被释放。
  • 我同意,帕斯卡,但这是合理的
  • 天哪,我一定要丢了它!我在应用程序的入口点添加了一个分配/解除分配块,所有 malloc 错误都消失了……这到底是什么?!!!

标签: c++ xcode gcc memory-management memory-leaks


【解决方案1】:

这些自定义框架之一是否有可能重新定义new 和/或delete?尝试将此替换添加到您的测试程序中,并查看是否 a) 测试程序在构建时不会抱怨 new 和/或 delete 的多个定义和 b) 它运行并显示每个新的删除?

 // not a real replacement, for testing purposes only
void * operator new (size_t sz) 
{
 printf("my new\n");
 return malloc(sz);
}
void operator  delete (void*ptr) 
{
 printf("my delete\n");
 free(ptr);
}
void operator  delete[] (void*ptr) 
{
 printf("my delete[]\n");
 free(ptr);
}

【讨论】:

  • 等等,我该怎么做?不幸的是,GCC 不允许新/删除运算符重载,它会给出“重新定义”错误...
  • 当然,您可以使用 GCC 在 C++ 中定义自己的新建/删除。当然,除非其他东西提供了新的/删除的重载——这就是我想知道的。您能否将 gcc 给您的错误添加到您的帖子中?它们是在编译时还是链接时发生的?
  • 谢谢,路德!看来您是对的 - new 和 delete 运算符已经重载,malloc 错误可能是由于在框架初始化之前使用 new/delete 运算符导致的,这会使它们重载。男人...
猜你喜欢
  • 2021-07-23
  • 2018-09-30
  • 2011-09-21
  • 2011-08-06
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多