我使用'免费'释放内存时出现分段违规

时间:2012-04-19 12:56:52

标签: c++ crash segmentation-fault

我正在尝试一个示例程序,我使用“malloc”分配内存并使用“free”取消分配内存...我知道使用“new”和“delete”是正确的方法,但是我只想了解....

我遇到了“分段违规”的崩溃,但我无法理解为什么......

class Object{
    public:
       Object(){
          this->def = 10;
          std::cout<<"Object Constructed"<<std::endl;
        }
        ~Object(){
             std::cout<<"Object Destructed"<<std::endl;
         }
         void amIPresent(){
              std::cout<<"Yes Object is Present, Defaulter is "<<this->def<<std::endl;
          }
     private:
         int def;
 };


 int main(){
     std::cout<<"Using malloc to Construct Object"<<std::endl;
     Object *o = static_cast<Object*>(malloc(sizeof(Object)));
     Object o2;
     o = &o2;
     std::cout<<"Freeing Memory using \"free\""<<std::endl;
      o->amIPresent();
      free(o);
      return 0;
 }

输出:

 Using malloc to Construct Object
 Object Constructed
 Freeing Memory using "free"
 Yes Object is Present, Defaulter is 10
 Segmentation fault

4 个答案:

答案 0 :(得分:4)

因为您要重新分配o以指向未使用malloc创建的对象。所以在它上面调用free毫无意义。

答案 1 :(得分:2)

当你释放o时,它指向在堆栈上分配的o2的地址(作为变量)。您不得将free用于堆栈对象。

答案 2 :(得分:0)

我认为您误解了此代码的工作原理:

 Object *o = static_cast<Object*>(malloc(sizeof(Object)));
 Object o2;
 o = &o2;

首先

 Object *o = static_cast<Object*>(malloc(sizeof(Object)));

将在堆上分配一块内存,变量o将指向它。

 Object o2;

将在堆栈上创建一个对象(在堆栈上分配,并调用构造函数)。

 o = &o2;

将指向堆栈上的该对象,它不再引用您使用malloc在堆上分配的内存。

所以当你使用

  free(o);

它将尝试释放堆栈中的内存而不是使用malloc释放的内存,因此崩溃。

您应该查看新的展示位置。请参阅示例What uses are there for "placement new"?

答案 3 :(得分:0)

你已经声明了一个指针o,你在堆上分配了一些空间,然后你重新分配它指向一个基于堆栈的对象o2我不确定你的逻辑在做什么这样做会导致内存泄漏。

然后释放与o2相关联的内存,但随后“o2”被破坏 - 因为所有基于堆栈的变量都会在您退出其范围时自动释放 - 这会尝试释放已释放的内存。

这里的问题是你混合了基于堆栈和堆的对象。永远不要试图删除(或释放)在堆栈上创建的对象,正如其他人所说,在C ++中坚持使用new和delete专门用于基于堆的对象。