假设我有两个班级。 Class1
将Class2
的实例作为参数进行初始化。那么下面两行代码有什么区别?
据我所知,当您使用new
时,会创建一些内存空间,您应该使用delete
来擦除该内存。那么在这种情况下首先使用非标准是否安全?
Class1 c1(new Class2(argu));
Class1 c1(Class2(argu));
答案 0 :(得分:1)
Class1 c1(new Class2(argu));
new
运算符在Class2 object
中分配heap
,并且在它不再使用时必须记住delete
,否则内存泄漏会发生。它将调用Class1(Class2 *p)
构造函数。从技术上讲,你的构造函数必须存储该指针,以便以后删除它。
Class1 c1(Class2(argu));
此行创建一个临时对象Class2
,并始终尝试首先调用接受临时Class1(Class2&& c)
对象的Class2
构造函数。
如果您没有,则会调用Class1(Class2& c)
[通过参考]或Class1(Class2 c)
[按值](您只能同时拥有其中一个)。< / p>
答案 1 :(得分:0)
new
在堆上分配一个新实例并返回指向它的指针。为了接受它,你的构造函数应该被定义为Class1(Class2*)
。第二个片段在堆栈上声明了一个新实例,并且可以通过引用Class1(Class2&)
使用。
答案 2 :(得分:0)
那么下面两个代码有什么区别?
这取决于Class1
的构造函数是如何实现的。为了第一个建设成功;
Class1::Class1(Class2* arg);
Class1
需要通过指针接受参数(也可能const
)。需要进一步的文档来确定参数是否应该new
或者是否只需要一个指针(如果使用了更多的C风格)。最有可能的是,对于现代惯用的C ++,它需要new
。
第二个构造函数需要引用或值;
Class1::Class1(const Class2& arg); // lvalue ref
Class1::Class1(Class2&& arg); // rvalue ref
Class1::Class1(Class2 arg); // value
第一种形式是复制构造函数,第二种形式是移动构造函数,它们都将绑定到创建的临时Class2
对象。第三种形式是按价值,也将适当约束。
在这种情况下,首先使用非标准是否安全?
完全没有。如果将Class1
构建为Class2
资源的RAII类型类,那么此表单就是您所期望的。
注意在new
的情况下,有人需要调用相应的delete
以确保该类被破坏并释放内存。
答案 3 :(得分:-1)
使用new分配动态内存,用于第一行的指针。第二行声明了一个新实例。
您可能会阅读动态内存分配以及类 http://www.cplusplus.com/doc/tutorial/dynamic/