21
A *a = new A();

这会创建一个指针还是一个对象?

我是 C++ 初学者,所以我想了解这种差异。

4

7 回答 7

44

两者:您创建了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`
于 2013-04-20T06:17:57.063 回答
15

这会在堆上创建一个类型的对象A,并将指向它的指针存储在a(存储在堆栈上)中。

delete aPS当你完成它时不要忘记调用它,这样它就A可以被销毁并将它的内存返回给堆。更好的是,a变成一个智能指针。

于 2013-04-20T06:17:36.993 回答
11

它创造了两者。
A*在堆栈上创建类型对象,A在堆上创建类型对象。

相当于

A *a;
a = new A();
于 2013-04-20T06:19:41.830 回答
4

它将创建对象和指针。


首先调用 new A() ,如果您有默认构造函数,那么它会调用该构造函数并使用默认值初始化该对象,否则它将使用默认值初始化。因为我们使用的是新的密钥,所以它将为堆上的对象 A 分配内存. New关键字用于在堆上动态分配内存。NEW返回对象的起始地址。

之后 A 类型指针将具有new操作员返回的对象 A() 的地址。

于 2013-04-20T08:24:24.527 回答
3

正如其他人所说,它创造了两者。但是对象 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
于 2013-04-20T13:07:43.283 回答
1

它创造了两者。

首先创建一个 A 类型的对象,然后存储一个指向它的指针

有关指针的更多信息,请查看此处

于 2013-04-20T08:41:09.287 回答
0

一个对象和指针。该对象必须有一个指针供您引用,但是,您可以让一个对象由多个指针指向。

于 2013-04-20T18:01:24.930 回答