假设我已经定义了一个类:
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?
}
我希望你们能理解我在说什么并帮助我。
答案 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
的使用限制在最小值,并且仅在需要时。
答案 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
对象的引用的函数中,它将指向一个在函数退出后无效的内存地址。