C++ 指向类实例的指针?

C++ 指向类实例的指针?,c++,C++,这是我第一次问问题。我是外国人,所以解释我的问题有点困难。也许我的标题也错了。。。让我们看看代码: 假设我定义了一个类: class Test { public: Test(); }; int main() { Test *pointer = new Test(); //what's the difference between these two ways, Test test; //if the two wa

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

假设我定义了一个类:

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? 
}
我希望你们能理解我说的话并帮助我

Test *pointer = new Test(); 
是内存泄漏,因为您从未释放内存。对象是在堆上创建的

Test test;
对象是在堆栈上创建的。到达最后一个花括号时,对象将被删除。它“超出范围”

它们不一样,哪个更好取决于你的需要

Test *pointer = new Test();
freestore(通常称为Heap)上创建
Test
对象。它会一直保存在内存中,直到您对
new
返回的地址显式调用
delete
。它被称为动态分配的对象

Test test;
自动存储上创建
Test
对象,并在创建对象的作用域(
{
}
)结束时释放该对象。内存会自动(隐式)释放,因此名为Automatic。这是C中广泛使用的概念的基础++

什么时候使用哪一个?

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

使用哪一个取决于你手头的情况。但是,请注意,在C++中,通常只希望在需要时限制<代码>新< /C> >的使用。p> 读得好:


测试将在堆栈上创建一个对象。它是函数
main
的本地属性,在退出
main
时将自动取消分配。如果只需要使用当前块中的对象,请使用此选项

Test*指针=新测试()
将在堆上创建一个对象,其生存期不限于声明该对象的块。当您使用
new
以这种方式声明对象时,在某个时候您需要对该对象调用
delete
,否则您将泄漏内存,因此您将承担处理内存管理的额外负担。当您需要创建需要保留的对象时,即在代码的其他部分中,通过当前函数时,请使用此选项

鉴于以上几点,以下代码有一个问题:

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