关于构造函数和内存泄漏的问题

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导致内存泄漏吗?

JeJ*_*eJo 5

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)

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

  • 或者根本不使用指针(在这种特定情况下实际上并不需要)。 (2认同)
  • @Someprogrammerdude 完全同意。我认为OP想要练习指针而不是适当的用法。 (2认同)