删除函数外部的实例化对象
Deleting instantiated objects outside of a function?
如何删除函数内的实例化对象,然后在调用另一个函数时删除?
例如:
int function_test(){
object* a = new object();
}
int function_test2(){
delete a;
}
调用 function_test2() 时需要删除对象 a。Function_test() 创建并设置对象 a 的值。
为了删除某些内容,您需要一个指向某些内容的指针。
当您在函数function_test
中分配对象并希望在function_test2
中删除它时,您需要注意一种方法,让function_test2
掌握指向要删除的对象的指针。
有多种方法可以做到这一点,但最常见的方法是让function_test
将指针返回给调用方,然后将该指针传递给function_test2
:
object* function_test() {
object* a = new object();
...
return a;
}
void function_test2(object* a) {
...
delete a;
}
调用方需要"转移"指针,如下所示:
object obj = function_test();
...
function_test2(obj);
传输指针的其他方法包括使用文件静态指针、使用全局指针,以及当函数function_test
和function_test2
是类的成员函数时使用实例变量。
不能在函数之间传输局部变量。如果你喜欢做这样的事情,我建议你返回指针,这样你就可以把它传递给下一个函数。
object *function_test()
{
auto *o = new object{};
return o;
}
但是,这样做的缺点是,您必须在调用此变量的任何位置捕获此变量,并且必须进行内存管理。很可能你只是想使用面向对象的东西,类似于:
class ObjectOwner final
{
public:
int function_test(){
a = new object();
}
int function_test2(){
delete a;
}
private:
object *a{nullptr};
};
可用作:
ObjectOwner owner;
owner.function_test();
owner.function_test2();
更好的方法是使用std::unique_ptr<object>
,这样当您忘记调用第二个函数时,内存就会被释放。
最后,您可以考虑使用构造函数/析构函数。
class ObjectOwner final
{
public:
ObjectOwner()
: a(std::make_unique<object>())
{
}
~ObjectOwner() = default;
void func() { /*Do something with a*/ }
private:
std::unique_ptr<object> a{};
};
允许您编写:
ObjectOwner owner{};
owner.func();
相关文章:
- 为什么我不能引用指向实例化对象的函数的指针?
- 为什么在使用指针时不采用类成员的默认值,而不是直接实例化对象时?
- 实例化对象并调用方法,使用单行语法在 C# 或 C++ 中返回值?
- 为什么我不能更改实例化对象内部的向量?
- 为共享指针C++单独实例化对象
- 错误 C2280 / 在 std::vector 中实例化对象时复制构造函数出现问题?
- C++:我可以在 void 函数中实例化对象吗?
- 为什么当我在构造函数中创建线程时,实例化对象和对象的指针的行为不同
- 是否可以由于以下原因在堆中实例化对象
- 一类应管理其实例化对象
- 实例化对象时如何修复分段故障错误
- QML实例化C 对象.我如何访问他们的方法
- 如何在 c++ 中使用枚举参数实例化对象
- C 实例化对象,在没有指针的情况下,其他类构造函数中没有默认构造函数
- 用push_back()实例化对象时,如何将指针传递给对象的构造函数
- 我如何在C 类的内部实例化对象
- 两者之间的最佳方法是什么:实例化对象或使用指针
- 从标头中的类实例化对象
- 我能否获得一个C++编译器在编译时实例化对象
- 访问不带实例化对象的非静态成员函数