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
时,您将丢失指向已分配对象的指针,并导致内存泄漏。此外,如果您在可能在其他地方使用指针的上下文中执行此操作,例如在返回对测试
对象的引用的函数中,它将指向函数退出后无效的内存地址