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
PS当你完成它时不要忘记调用它,这样它就A
可以被销毁并将它的内存返回给堆。更好的是,a
变成一个智能指针。
它创造了两者。
它A*
在堆栈上创建类型对象,A
在堆上创建类型对象。
相当于
A *a;
a = new A();
它将创建对象和指针。
首先调用 new A() ,如果您有默认构造函数,那么它会调用该构造函数并使用默认值初始化该对象,否则它将使用默认值初始化。因为我们使用的是新的密钥,所以它将为堆上的对象 A 分配内存. New
关键字用于在堆上动态分配内存。NEW
返回对象的起始地址。
之后 A 类型指针将具有new
操作员返回的对象 A() 的地址。
正如其他人所说,它创造了两者。但是对象 A 是在免费商店中创建的,现在您必须记住手动操作delete
它。请记住,C++ 中的任何函数都可以抛出异常,除非它被声明为noexcept
. 所以现在你不仅要记住delete
什么时候没有抛出异常,你现在还需要想象代码可以采用的所有路径,并编写适当的try-catch
块来手动处理delete
你的对象。
你正在做的事情被称为赤裸裸的新,这是一个简单的方法来射击自己的脚。
值得庆幸的是,C++11 有一个解决这个问题的方法:智能指针。考虑指针的语义,它是由一个实体拥有还是在多个实体之间共享?在前一种情况下,您需要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
一个对象和指针。该对象必须有一个指针供您引用,但是,您可以让一个对象由多个指针指向。