-1

这是我第一次提出问题。我是外国人,所以有点难以解释我的问题。也许我的标题也是错误的......让我们看看代码:

假设我定义了一个类:

class Test
{
    public:
        Test();
};

int main()
{
     Test *pointer = new Test(); //what's the difference between these two ways, 
     Test test;                  //if  the two ways are the same, which one is better under what
     pointer = &test;            //circumstance? 
}

我希望你们能理解我在说什么并帮助我。

4

3 回答 3

5
Test *pointer = new Test();

在freestore(通常称为 Heap)上创建Test对象。它一直存在于内存中,直到您显式调用 . 它返回的地址。它被称为动态分配的对象。deletenew

Test test;

在自动存储上创建Test对象,一旦创建对象的作用域(,)结束,它就会被释放。内存被自动(隐式)释放,因此命名为Automatic。这是广泛使用的资源获取概念的基础是初始化C++ 中的(RAII){}

什么时候用哪一个?

  • 如果您希望您的对象在创建它的范围之外持续存在,请使用#1或使用#2.
  • 通常,堆栈大小是有限的,因此如果您的对象占用大量内存,那么您可能会用完堆栈空间,在这种情况下通常会选择#1.

因此,使用哪一个取决于您手头的情况。但是,请注意,在 C++ 中,通常希望将使用限制在new最低限度并且仅在需要时使用。

好读:
为什么 C++ 程序员应该尽量减少“新”的使用?

于 2012-08-28T04:09:49.460 回答
2
Test *pointer = new Test(); 

是内存泄漏,因为您从未释放内存。该对象是在堆上创建的。

Test test;

该对象是在堆栈上创建的。当到达最后一个花括号时,对象被移除。它“超出范围”。

它们不一样,哪个“更好”取决于您的需求。

于 2012-08-28T04:07:23.160 回答
1

Test test;将在堆栈上创建一个对象。它是函数的局部变量,退出main时会自动释放。main当您只需要使用当前块中的一个对象时使用它。

Test *pointer = new Test();将在堆上创建一个对象,其生命周期不限于声明它的块。当您以这种方式声明对象时 - 使用new- 然后在某些时候您需要调用delete该对象,否则您将泄漏内存,因此您承担了处理内存管理的额外负担。当您需要创建一个需要保留的对象时使用它,即在代码的其他部分中,超过当前函数。

鉴于这几点,下面的代码就有问题了:

Test *pointer = new Test();
Test test;
pointer = &test;

当您分配对pointer的引用时test,您会丢失指向已分配对象的指针,并泄漏内存。此外,如果您在可能pointer在其他地方使用的上下文中执行此操作,例如在返回对Test对象的引用的函数中,它将指向函数退出后无效的内存地址。

于 2012-08-28T04:10:57.587 回答