目录
一、new和free混用
//构造函数中初始化
//析构函数清理资源
class A
{
private:
int* p;
public:
A()
{
std::cout << "A()" << std::endl;
}
~A()
{
std::cout << "~A()" << std::endl;
}
};
// 构造函数中初始化
// 析构函数清理资源
class A
{
private:
int* p;
public:
A()
{
p = new int(1);
std::cout << "A()" << std::endl;
}
~A()
{
delete p;
p = nullptr;
std::cout << "~A()" << std::endl;
}
};
总结:
- 如果new之后进行free,程序可以运行成功,但是不会调用析构函数。
- 如果析构函数中有资源需要进行清理的话,new之后进行free会存在内存泄露的问题
- 最后不要new和free一起用,即使程序运行没有问题,可能会存在内泄露的问题。
二、malloc和delete混用
//构造函数中初始化
//析构函数清理资源
class A
{
private:
int* p;
public:
A()
{
std::cout << "A()" << std::endl;
}
~A()
{
std::cout << "~A()" << std::endl;
}
};
//构造函数中初始化
//析构函数清理资源
class A
{
private:
int* p;
public:
A()
{
p = new int(1);
std::cout << "A()" << std::endl;
}
~A()
{
delete p;
p = nullptr;
std::cout << "~A()" << std::endl;
}
};
总结:
- malloc之后调用delete,不会调用构造函数进行初始化,会调用析构函数进行资源清理。
- 如果析构函数有资源需要清理,程序会崩溃;如果没有资源清理,程序运行成功。
- 不建议malloc之后使用delete,程序可能会崩溃。