首页 > 解决方案 > 关于构造函数和内存泄漏的问题

问题描述

我正在使用构造函数和析构函数进行测试,我想看看是否可以在不先声明的情况下将对象传递给函数,如下例所示:

#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功能工作正常,它完全符合我的预期,但我想知道:

标签: c++classconstructormemory-leaksdestructor

解决方案


那个新的会导致内存泄漏吗?

是的,它导致了内存泄漏。无论您new编辑什么,都应该delete在病房后编辑(手动内存管理)。


为什么我的用户定义的析构函数没有被调用?

因为对象还没有被deleted,因此没有被破坏。

你应该做

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 caras

display(car{ "HYUNDAI", 2012 });

请参阅:C++ 中的指针变量和引用变量有什么区别?


推荐阅读