Thu*_*ang 1 c++ constructor destructor memory-leaks class
我正在使用构造函数和析构函数进行测试,我想看看是否可以在不先声明的情况下将对象传递给函数,如下例所示:
#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));
}
Run Code Online (Sandbox Code Playgroud)
该display功能运行良好,并且完全符合我的预期,但我想知道:
new如果我在输入中声明了关键字display,为什么我的用户定义的析构函数没有被调用,并且new导致内存泄漏吗?new 会导致内存泄漏吗?
是的,它导致了内存泄漏。无论您new编辑什么,都应该delete在之后编辑(手动内存管理)。
为什么我的用户定义的析构函数没有被调用?
因为该对象还没有被delete删除,因此没有被破坏。
你应该做
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;
}
}
Run Code Online (Sandbox Code Playgroud)
除了手动内存管理之外,您还可以使用智能指针。
话虽这么说,对于所示的情况,您不需要指针(除非您想使用指针进行练习)。一种选择是将其传递为const car&也适用于临时对象。
void display(const car& p)
// ^^^^^^^^^^^^
{
std::cout << "Name: " << p.name << std::endl;
std::cout << "Num: " << p.num << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
你可以传递一个caras
display(car{ "HYUNDAI", 2012 });
Run Code Online (Sandbox Code Playgroud)