2013-04-20 64 views
21
A *a = new A(); 

这是否会创建一个指针或对象?A * a = new A();这是否创建一个指针或一个对象?

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

+10

如果它只创建一个指针,那个指针指向的是什么? – Mat 2013-04-20 06:17:51

+49

当你购买一个新房子时,你有没有获得一个新的街道地址或新房子? – Mehrdad 2013-04-20 06:18:52

+2

指针也是一个对象本身。 – Nawaz 2013-04-20 13:07:32

回答

44

Both:你创建了一个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` 
15

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

P.S.当你完成它时,不要忘记拨打delete a,以便A可以被销毁,并将其内存返回堆中。更好的是,将a变成智能指针。

+0

我希望你不要介意这个微小的编辑来澄清'a'的存储位置。 – 2013-04-20 06:21:47

+0

如果A类的构造函数不是异常保存,那么该怎么办?然后可以引发异常并且不会创建实例,在这种情况下调用delete之后,您将收到运行时错误。 – 2013-04-20 06:22:16

+7

更像是不要忘记使用智能指针,而不必担心安全删除它。 – chris 2013-04-20 06:28:41

11

这既创造。
它在堆上创建类型为A*的对象,并在堆上创建类型为A的对象。

相当于

A *a; 
a = new A(); 
4

这将创建两个对象,以及指针。


Firstlly新的A()被调用,如果您有默认的构造函数然后调用构造函数和初始化缺省值对象,否则它会与defaul初始化values.Because我们使用新keywork那么它将分配内存为堆上的对象A. New关键字用于在堆上动态分配内存。 NEW返回对象的起始地址。

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

1

它创建了两者。

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

欲了解更多信息,请指针来看看here

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 
0

一个对象和指针。该对象必须有一个指针供您参考,但是,您可以通过多个指针指向一个对象。

相关问题