A *a = new A();
这是创建指针还是对象?
我是一名c ++初学者,所以我想了解这种差异。
答案 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-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
答案 5 :(得分:1)
答案 6 :(得分:0)
一个对象和指针。该对象必须有一个指针供您引用,但是,您可以让一个对象由多个指针指向。