c++ - 关于构造函数和内存泄漏的问题
问题描述
我正在使用构造函数和析构函数进行测试,我想看看是否可以在不先声明的情况下将对象传递给函数,如下例所示:
#include<iostream>
#include<stdlib.h>
using namespace std;
class car
{
public:
string name;
int num;
public:
car(string a, int n)
{
cout << "Constructor called" << endl;
this->name = a;
this->num = n;
}
~car()
{
cout << "Deleted" << endl;
}
};
void display(car* p)
{
cout << "Name: " << p->name << endl;
cout << "Num: " << p->num << endl;
}
int main()
{
display(new car("HYUNDAI", 2012));
}
该display
功能工作正常,它完全符合我的预期,但我想知道:
- 如果我
new
在输入中声明了关键字 todisplay
,为什么我的用户定义的析构函数没有被调用,并且 - 这会
new
导致内存泄漏吗?
解决方案
那个新的会导致内存泄漏吗?
是的,它导致了内存泄漏。无论您new
编辑什么,都应该delete
在病房后编辑(手动内存管理)。
为什么我的用户定义的析构函数没有被调用?
因为对象还没有被delete
d,因此没有被破坏。
你应该做
void display(car* p)
{
if (p) // check p is valid pointer
{
std::cout << "Name: " << p->name << std::endl;
std::cout << "Num: " << p->num << std::endl;
// ...after use
delete p;
}
}
作为手动内存管理的替代方案,您可以使用智能指针。
话虽如此,对于所示的情况,您不需要指针(除非您想练习指针)。一种选择是传递它,因为const car&
它也适用于临时对象。
void display(const car& p)
// ^^^^^^^^^^^^
{
std::cout << "Name: " << p.name << std::endl;
std::cout << "Num: " << p.num << std::endl;
}
你可以通过 a car
as
display(car{ "HYUNDAI", 2012 });
推荐阅读
- javascript - 在字符串数组中查找字符组合
- bash - 使用 grep 从列表中删除所有出现的两个值
- ios - 不一致的 UIStackview isHidden 动画
- mongodb - 下面代码中的类型有什么问题如何为 o 定义类型
- django - django中的自动完成字段
- javascript - 需要访问 Vue.js 中的数据元素
- react-native - React 从 babel 6 到 babel 7 的原生升级
- java - 使用Google表格api将类型错误分配给Java中的ValueRange变量以进行附加?
- forms - MS-Access,多个客户的连续形式 - Form.Text 字段包含列表中每个客户/客户的最后一次通信
- javascript - 当时间超过设定时间时做某事