A * a =新A();这会创建指针还是对象?

时间:2013-04-20 06:16:07

标签: c++

A *a = new A();

这是创建指针还是对象?

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

7 个答案:

答案 0 :(得分: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`

答案 1 :(得分:15)

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

P.S。完成后请不要忘记调用delete a,以便可以销毁A并将其内存返回堆中。更好的是,将a转换为智能指针。

答案 2 :(得分:11)

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

相当于

A *a;
a = new A();

答案 3 :(得分:4)

它将同时创建对象和指针。


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

之后是一个类型指针,它将具有new运算符返回的对象A()的地址。

答案 4 :(得分:3)

正如其他人所说,它创造了两者。但是对象A是在免费商店中创建的,现在您必须记住手动delete它。请记住,C ++中的任何函数都可以抛出异常,除非它被声明为noexcept。因此,现在不仅要记住delete没有抛出异常,您现在还需要想象代码可以采用的所有路径,并手动编写适当的try-catchdelete你的对象。

你正在做的事情被称为赤裸裸的新人,这是一种轻松拍摄自己的方法。

值得庆幸的是,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

答案 5 :(得分:1)

它创造了两者。

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

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

答案 6 :(得分:0)

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