void someFunction() {MyClass obj = MyClass();
}void someFunction() {MyClass obj = new MyClass();}void someFunction() {MyClass* obj = new MyClass();
}void someFunction() {std::unique_ptr<MyClass> obj = std::make_unique<MyClass>();
}在函数中用这4种方式内存会不会在函数结束后释放,有啥差异
void someFunction() { MyClass obj;
}
在这个例子中,obj 是一个局部对象,它在栈上被创建和分配内存。当 someFunction 函数结束时,obj 的生命周期结束,它的析构函数会被自动调用,其占用的内存(在栈上)也会被自动释放。
void someFunction() { MyClass obj = new MyClass(); // 这是错误的
}
这个代码实际上是有问题的,因为 new MyClass() 返回一个指向 MyClass 对象的指针,但这里尝试将其赋值给一个 MyClass 类型的对象,而不是指针。这会导致编译错误。如果正确的写法是使用指针(如下一个例子所示),则内存不会在函数结束时自动释放。new关键字会在堆上分配内存并返回一个指向新分配的内存的指针,因此你不能将它赋值给一个对象,而应该赋值给一个指针。
void someFunction() { MyClass* obj = new MyClass();
}
在这个例子中,obj 是一个指向 MyClass 对象的指针,该对象在堆上通过 new 运算符被创建和分配内存。当 someFunction 函数结束时,obj 指针本身(在栈上)会被销毁,但它所指向的对象在堆上的内存并不会被自动释放。这会导致内存泄漏,除非你在函数外部或其他地方显式地使用 delete obj; 来释放内存。
void someFunction() { std::unique_ptr<MyClass> obj = std::make_unique<MyClass>();
}
在这个例子中,obj 是一个 std::unique_ptr 类型的智能指针,它拥有(unique ownership)一个通过 std::make_unique() 在堆上创建的 MyClass 对象。当 someFunction 函数结束时,obj(在栈上)的生命周期结束,它的析构函数会被自动调用。由于 std::unique_ptr 管理着其指向的对象的生命周期,所以它会确保在析构时自动调用 delete 来释放堆上的内存,从而防止了内存泄漏。
总结:
第一种方式(局部对象)会在函数结束时自动释放内存(在栈上)。
第二种方式(错误的赋值)会导致编译错误。
第三种方式(裸指针)不会在函数结束时自动释放内存(在堆上),需要手动释放。
第四种方式(智能指针)会在函数结束时自动释放内存(在堆上),通过智能指针的析构函数
用new,在堆中分配了内存,堆上的内存分配,亦称动态内存分配
https://blog.csdn.net/ytusdc/article/details/88621223