A *a = new A();
这会创建一个指针还是对象?
我是一名C++初学者,所以我想了解这个区别。
A *a = new A();
这会创建一个指针还是对象?
我是一名C++初学者,所以我想了解这个区别。
你创建了一个 A
的新实例(即对象),并创建了一个指向该实例的指针称为 a
。
你可以将其分为两个语句:
A *a; // Declare `a` of type: pointer to `A`
a = new A(); // create a new instance of `A` and
// assign the resulting pointer to `a`
A
的对象,并将指针存储在a
中(该指针存储在堆栈中)。delete a
,以便销毁A
并将其内存归还给堆。最好将a
转换为智能指针。a
存储的位置。 - Ed HealA
的构造函数引发异常,则 delete a
仍然可以正常工作。不需要智能指针或检查任何内容。 - Pete Becker它同时创建两者。
它在栈上创建类型为A*
的对象,并在堆上创建类型为A
的对象。
等价于
A *a;
a = new A();
这将创建对象和指针。
首先,调用new A()
,如果您有默认构造函数,则调用该构造函数并使用默认值初始化该对象,否则将使用默认值进行初始化。因为我们使用了new
关键字,所以它会在堆上为对象A分配内存。new
关键字用于在堆上动态分配内存。NEW
返回对象的起始地址。
之后是A类型的指针,它将具有由new
运算符返回的对象A()的地址。
delete
它。请注意,C++中的任何函数都可能抛出异常,除非它声明为noexcept
。因此,现在不仅要记住在没有抛出异常时delete
,还需要想象代码可能采取的所有路径,并编写适当的try-catch
块来手动delete
对象。std::unique_ptr
:#include <memory>
std::unique_ptr<A> a(new A{});
现在你不需要调用delete
,内存管理已经为你处理。在后一种情况下,你需要使用std::shared_ptr
。
#include <memory>
std::shared_ptr<A> a(new A{});
但是C++中关于序列点的定义可能无法保证这种创建智能指针的方式总是安全的,不详细解释:
std::shared_ptr<A>(new A{new B, new C});
可能会产生内存泄漏,为了避免这种情况,使用 std::make_shared
#include <memory>
auto a = std::make_shared<A>(); // a now holds a shared_ptr to A
很遗憾,在完成C++11时,委员会忘记了std::make_unique
。这个问题应该在C++14中得到解决:
#include <memory>
auto a = std::make_unique<A>(); // a now holds a unique_ptr to A
对象和指针。对象必须有一个指针供您引用,但是您可以有多个指针指向同一个对象。
A *a
是一个指针。它可以保存一个地址。new A()
返回一个新创建对象的地址。 - Hot Licks