我正在尝试一个示例程序,我使用“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
答案 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专门用于基于堆的对象。