我遇到了一种情况,我必须使用指针(指向类对象)作为参数在循环中调用函数。问题是,我无法修改该函数的签名,并且每次循环迭代时,我都必须初始化指针。这将导致内存泄漏,因为我无法删除循环内的指针(将其传递给函数后)。在这种情况下,有什么办法可以防止内存泄漏?
我想用一个简单的例子来解释:
class testDelete
{
public:
void setValue(int* val) {vec.push_back(val);};
void getValue();
private:
vector <int*> vec;
};
void testDelete::getValue()
{
for (int i=0;i<vec.size();i++)
{
cout << "vec[" << i << "] = " << *vec[i]<<"\n";
}
}
int main()
{
testDelete tD;
int* value = NULL;
for (int i=0;i<10;i++)
{
value=new int(i+1);
/*I am not allowed to change this function's signature, and hence I am forced to pass pointer to it*/
tD.setValue(value);
/*I cannot do delete here otherwise the getValue function will show garbage value*/
//delete value;
}
tD.getValue();
return 0;
}
如果deleteTest
想使用可能消失的对象的指针,它应该持有std::weak_ptr
s。保留原始指针并稍后取消引用它是危险的(除非您可以确保对象仍然存在,也就是不要使用原始但智能的指针)。
[...] 我无法修改该函数的签名,并且每次循环迭代时,我都必须初始化指针。在这种情况下,有什么办法可以防止内存泄漏?
如果您需要动态分配的对象,请使用智能指针(例如std::smart_ptr
共享所有权)。如果您不需要动态分配它们,那就不要。
为了这个例子,假设你不能修改deleteTest
,那么对于整数,没有理由动态分配任何东西
int main()
{
std::array<int,10> x;
testDelete tD;
for (int i=0;i<10;i++)
{
x[i] = i+1;
tD.setValue(&x[i]);
}
tD.getValue();
return 0;
}
对这段代码持保留态度,实际上deleteTest
需要对其进行修复以避免造成麻烦。
TL; 博士
在您的示例中,您实际上有两个问题。deleteTest
可能会尝试访问已经消失的对象和内存泄漏main
。使用智能指针可以解决这两个问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句