这是释放新对象的正确方法吗?

问题描述 投票:0回答:1
#include <iostream>

class Dude
{
public:
    int age;

    Dude(int age)
    {
        this->age = age;
    }
};

int main(int argc, char* argv[])
{
    Dude *dude1 = new Dude(21);
    std::cout << dude1->age << '\n';

    delete dude1;

    return 0;
}

这是释放

dude1
的内存并销毁对象
dude1
的正确方法吗?

如果保留为默认析构函数,析构函数会做什么内存释放和清理?

dude1->~Dude();

这段代码是做什么的?

c++ class destructor
1个回答
1
投票

这是释放

dude1
的内存并销毁对象
dude1
的正确方法吗?

是的,它在技术上是正确的

但是,这不是 best 选项。一个 better 选项是在自动存储中创建

Dude
对象,根本不用担心它的释放/清理,让编译器为你担心,例如:

int main(int argc, char* argv[])
{
    Dude dude1(21);
    std::cout << dude1.age << '\n';

    return 0;
}

如果你必须动态创建对象,至少使用像

std::unique_ptr
这样的智能指针,这样你就不需要手动
delete
对象,例如:

#include <memory>

int main(int argc, char* argv[])
{
    auto dude1 = std::make_unique<Dude>(21);
    // prior to C++14, use this instead: 
    // std::unique_ptr<Dude> dude1(new Dude(21));

    std::cout << dude1->age << '\n';

    return 0;
}

如果保留为默认析构函数,析构函数会做什么内存释放和清理?

在这个例子中,什么都没有。

delete
执行两个独立的任务——它 destroys 对象(即调用它的析构函数),然后 释放对象占用的内存。析构函数不是后一个任务的一部分。

所以,在这个例子中,默认的 destructor 什么都不做,因为它没有什么可以销毁的。

Dude
有一个单独的
int
数据成员,它存储在自动存储中,因此它的内存与
Dude
对象的内存相关联。当
Dude
对象的内存被释放时(在对象被破坏之后),
int
将简单地消失。

dude1->~Dude();

这段代码是做什么的?

它显式调用对象的析构函数,就像任何其他方法调用一样。但是,不要这样做,除了用

placement-new
构造的对象,例如:

int main(int argc, char* argv[])
{
    // FYI, this is not the correct way to ensure the allocated memory
    // is satisfactory for creating an object in it, this is simplified
    // just for demonstration purposes!
    char *buffer = new char[sizeof(Dude)];

    Dude *dude1 = new (buffer) Dude(21);
    std::cout << dude1->age << '\n';

    dude1->~Dude();

    delete[] buffer;

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.