【发布时间】:2019-01-16 20:14:37
【问题描述】:
我想知道是否有任何方法可以判断一个函数是否可以安全地删除作为参数传递的对象。
代码:
struct Test {
};
void f(Test *ptr) {
delete ptr; //if i delete the pointer here,
//i cannot use obj in main
}
int main() {
Test *obj = new Test;
f(new Test);
f(obj);
//delete obj; //obj has already been deleted in f()
}
有没有办法释放 f(new Test) 分配的内存,但保留 obj 并在 main() 中仍然使用它?
【问题讨论】:
-
std::shared_ptr 或其他智能指针,视情况而定。但是,您标记了 c++98,所以我假设您没有使用现代 c++?通常在被调用者中传递指针并删除将被认为是不好的做法。人们宁愿期望 obj 在已分配的 main 中被释放。但实际上,应该避免原始分配,并且只有在绝对必要的情况下才能将其封装到类中;例如。在 Test 中进行(取消)分配,并确保在析构函数中或更早地释放所有内容。
-
你不能。您需要通过规则建立ownership,并尽可能地执行这些规则。
-
感谢您澄清原始指针的使用。确实这是 c++98(所以没有智能指针)。
-
@Alex "这是 c++98(所以没有智能指针)" - C++98 有
std::auto_ptr智能指针。或者您可以使用来自Boost 库的智能指针。