指向类实例的指针?

时间:2012-08-28 04:04:36

标签: c++

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

假设我已经定义了一个类:

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? 
}

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

3 个答案:

答案 0 :(得分:5)

Test *pointer = new Test();

freestore (通常称为Heap)上创建Test对象。它会一直存在内存中,直到您在地址上明确调用delete为止由new返回。它被称为 动态 分配的对象。

Test test;

自动存储 上创建Test对象,并在范围({})中取消分配它被创建了结束。内存被自动(隐式)解除分配,因此名称为自动。这是广泛使用的 Resource Acquisition is Initialization(RAII) 概念的基础在C ++中

  

何时使用哪一个?

  • 如果您希望对象超出创建范围,请使用#1或使用#2
  • 通常,堆栈大小是有限的,因此如果您的对象占用大量内存,那么在这种情况下,您可能会耗尽堆栈空间,通常会使用#1

所以使用哪一个取决于你手边的情况。但是,请注意,在C ++中,人们通常希望将new的使用限制在最小值,并且仅在需要时。

好读:
Why should C++ programmers minimize use of 'new'?

答案 1 :(得分:2)

Test *pointer = new Test(); 

内存泄漏是因为您永远不会释放内存。该对象在堆上创建。

Test test;

在堆栈上创建对象。到达最后一个花括号时,将删除该对象。它超出了范围。

它们不一样,“更好”取决于你的需要。

答案 2 :(得分:1)

Test test;将在堆栈上创建一个对象。它是函数main的本地函数,并在main退出时自动取消分配。当您只需要使用当前块中的对象时,请使用此选项。

Test *pointer = new Test();将在堆上创建一个对象,其生命周期不限于声明它的块。当你以这种方式声明一个对象时 - 使用new - 那么在某些时候你需要在对象上调用delete或者你会泄漏内存,所以你要承担处理内存的额外负担管理。当您需要创建一个需要粘贴的对象时,即在代码的其他部分,通过当前函数时,请使用此方法。

鉴于这些要点,以下代码存在问题:

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

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