回答
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`
这会在堆上创建一个类型为A
的对象,并在a
(存储在堆栈中)中存储一个指向它的指针。
P.S.当你完成它时,不要忘记拨打delete a
,以便A
可以被销毁,并将其内存返回堆中。更好的是,将a
变成智能指针。
我希望你不要介意这个微小的编辑来澄清'a'的存储位置。 – 2013-04-20 06:21:47
如果A类的构造函数不是异常保存,那么该怎么办?然后可以引发异常并且不会创建实例,在这种情况下调用delete之后,您将收到运行时错误。 – 2013-04-20 06:22:16
更像是不要忘记使用智能指针,而不必担心安全删除它。 – chris 2013-04-20 06:28:41
这既创造。
它在堆上创建类型为A*
的对象,并在堆上创建类型为A
的对象。
相当于
A *a;
a = new A();
这将创建两个对象,以及指针。
Firstlly新的A()被调用,如果您有默认的构造函数然后调用构造函数和初始化缺省值对象,否则它会与defaul初始化values.Because我们使用新keywork那么它将分配内存为堆上的对象A. New
关键字用于在堆上动态分配内存。 NEW
返回对象的起始地址。
之后一个类型指针,它将具有由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
一个对象和指针。该对象必须有一个指针供您参考,但是,您可以通过多个指针指向一个对象。
- 1. 在A a = new A()之后真的创建了一个实例吗?
- 2. 哪个更好,a = []或a = new Array()?
- 3. A * pA = new A之间的区别;和A * pA = new A();
- 4. 下一个方法的术语名称是什么:A a = new A {Prop1 = a,Prop2 = b};
- 5. 如何创建一个<a href=> to facebook and share a message?
- 6. 如果(A = NULL &&一个的instanceof一个!)...或者,如果(一个的instanceof A)
- 7. 从IO a - > a写一个函数?
- 8. 测试非整数是否在范围[a,b) - 或[a,b],(a,b),(a,b)
- 9. Scipy稀疏矩阵求幂:a ** 16比a * a * a * a * a * a * a * a * a * a * a * a * a * a * a * a * a *
- 10. 如何在JavaScript的A函数或类中创建对象A的实例?
- 11. 哪些措施来简化这个(A + B)(A +!B)=一
- 12. 什么是后{a = 5; A = A ++; Syso(a);}
- 13. 获取型积分一个的值=>并[a]从一个积分的值=>([A],[A],[A])
- 14. 构建一个QueryExpression,其中名称字段是A或B
- 15. 当JVM加载类A时,或者当我调用A.class时,是否创建了Class对象A?
- 16. 这是什么意思?公式一=> A - > [A] - >布尔
- 17. 创建一个List(String)给出错误“Object reference not set to a instance of a object。”
- 18. F#是否有Seq.Single:seq <'a> - >'a?
- 19. ES6对象方法分配之间的区别:a,'a'和['a']?
- 20. A *寻找一个2D Sidescroller
- 21. 提取一个从[A]
- 22. Java:String a = Integer.toString(1);创建多少个对象?
- 23. x的值是什么? X = A ++ + ++ A + A ++
- 24. C++:创建一个共享的对象,而不是共享的对象指针
- 25. `new`如何创建一个对象?
- 26. 正则表达式。是否可以匹配(a或b)和(a或c)和(a或d)而不是aaa?
- 27. 会是怎样的$ A + $一个输出++ + $与$一个一个++ = 1
- 28. 针对具有条件的最后一个A元素
- 29. new [] {a,b}是什么意思和创建?
- 30. 指针和a = 1和* a = 1之间的差别
如果它只创建一个指针,那个指针指向的是什么? – Mat 2013-04-20 06:17:51
当你购买一个新房子时,你有没有获得一个新的街道地址或新房子? – Mehrdad 2013-04-20 06:18:52
指针也是一个对象本身。 – Nawaz 2013-04-20 13:07:32