当我们“必须”将循环中的指针传递给某个函数时,如何防止内存泄漏?

阿西什

我遇到了一种情况,我必须使用指针(指向类对象)作为参数在循环中调用函数。问题是,我无法修改该函数的签名,并且每次循环迭代时,我都必须初始化指针。这将导致内存泄漏,因为我无法删除循环内的指针(将其传递给函数后)。在这种情况下,有什么办法可以防止内存泄漏?

我想用一个简单的例子来解释:

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;
}
large_prime_is_463035818

如果deleteTest想使用可能消失的对象的指针,它应该持有std::weak_ptrs。保留原始指针并稍后取消引用它是危险的(除非您可以确保对象仍然存在,也就是不要使用原始但智能的指针)。

[...] 我无法修改该函数的签名,并且每次循环迭代时,我都必须初始化指针。在这种情况下,有什么办法可以防止内存泄漏?

如果您需要动态分配的对象,请使用智能指针(例如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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

WPF当我们的ViewModel是静态对象时防止内存泄漏

当我们说在执行程序时将操作系统的控制权传递给main()函数时,这是什么意思?

我们如何将字节作为关键字参数的键传递给函数?

当我们在while循环中给两个比较运算符时,python如何理解?

在循环中读取大文件时如何防止RubyMotion中的内存泄漏

当我们有值而不是指针时如何检查空指针取消引用

当我们将参数传递给System.out.println()时会发生什么?

当我们只有元素的标题时,如何获取某个列表元素的属性?

当我们删除该模块时,内核模块泄漏的内存会返回到系统吗?

当我们将指针打印到字符类型时,为什么C ++显示字符?

我们如何不用引用就可以通过引用将数组传递给函数

当我们有多个列表时循环jquery函数

当我们需要引发自定义异常时,如何防止异常捕获?

react-responsive-modal :当我们在 div 外单击时如何防止关闭模态

当我们可以通过&运算符传递变量的地址时,为什么要通过指针传递?

当我们从using块中的方法返回时,如何处理内存?

为什么我们将函数作为参数传递给python

当我创建一个函数时,每个li单击内部click函数,然后每次都在循环中运行li click。如何防止循环点击

为什么我们不允许将纯引用参数传递给std :: thread但允许传递原始指针?

我们如何将对象作为参数传递给对象值中的函数名?

我们可以将什么参数传递给super()?

我们如何从4个内部for循环中退出?

如何知道我们在使用PHP的循环中

如何将指针传递给函数并在函数C ++中动态分配内存

当我们在向量上使用唯一函数时,移位如何工作?

当我们显式设置容器的位置时,pack()函数的行为如何?

当我们调用函数ZipEntry.getSize时,库是否首先解压缩内存中的文件?

我们如何将多个类对象传递给WCF REST API?

我们如何将多个过滤器传递给 OData 读取