在C#中创建对象实例时
Myclass mc = new Myclass();
Run Code Online (Sandbox Code Playgroud)
mc现在,这是对Myclass在内存中创建的对象的引用。这就像是该内存的“指针”。
与在(托管或非托管)C ++中执行此操作是否相同或相当?
MyCppClass *mcCppClass = new MyCppClass();
Run Code Online (Sandbox Code Playgroud)
因为这实际上创建了指向该类的对象实例的指针。
我只是想找出差异到底是什么?
一个重要的区别(似乎没有人提到)是:
Myclass mc = new Myclass();
Run Code Online (Sandbox Code Playgroud)
在C#中,这是创建新对象的唯一正确方法。当您需要对象时,这就是创建对象的方式。
MyCppClass *mcCppClass = new MyCppClass();
Run Code Online (Sandbox Code Playgroud)
在C ++中,这是你如何可以创建一个对象,你如何偶尔必须创建一个对象。在C ++中使用这种方法的问题是:
new与托管语言相比,C / C ++的速度非常慢。如果用于分配您需要的每个对象,那将会很痛苦。delete它才销毁。如果您忘记这样做,它永远不会被破坏。如果调用delete两次,程序将崩溃。在C ++中,有两种创建对象的方式:上面使用的一种:
// 1
MyCppClass *myobject = new MyCppClass();
delete myobject;
Run Code Online (Sandbox Code Playgroud)
但对其进行了修改,使其也包含了该delete调用,因为没有它,您将泄漏内存。无论何时使用new,都必须迟早致电delete。通常,一个没有另一个就是错误。
第二种更常见的方法是:
// 2
MyCppClass myobject;
Run Code Online (Sandbox Code Playgroud)
在某些方面,第二个示例与您的C#示例更相似。它的生存期由系统自动管理(尽管管理的方式有所不同。在C ++中,它一直持续到超出范围为止;在C#中,它一直持续到没有人引用它并得到垃圾回收为止-但在两种情况下,则无需执行任何操作即可确保它被销毁)。通常,出于相同的原因,它也是创建对象实例的正确方法。
新C ++程序员最常犯的错误之一是用来new分配每个对象,存储指向它们的指针,然后尝试记住删除它们。一个更简单,更可靠,更有效的解决方案是尽可能避免new和避免使用指针。有时,您需要一个对象的生命周期不限于声明范围(并且在该范围之外使用该对象不是复制对象的选择)。然后,您可以使用new,并且很可能将结果指针包装在某种类型的智能指针中。
| 归档时间: |
|
| 查看次数: |
294 次 |
| 最近记录: |