C#对象和C ++对象的区别

Ton*_*ion 1 c# c++ pointers

在C#中创建对象实例时

Myclass mc = new Myclass();
Run Code Online (Sandbox Code Playgroud)

mc现在,这是对Myclass在内存中创建的对象的引用。这就像是该内存的“指针”。

与在(托管或非托管)C ++中执行此操作是否相同或相当?

MyCppClass *mcCppClass = new MyCppClass();
Run Code Online (Sandbox Code Playgroud)

因为这实际上创建了指向该类的对象实例的指针。

我只是想找出差异到底是什么?

jal*_*alf 5

一个重要的区别(似乎没有人提到)是:

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,并且很可能将结果指针包装在某种类型的智能指针中。