在这种情况下是否有任何内存泄漏?

时间:2014-03-09 11:08:37

标签: c++ pointers memory

这是代码,一个执行缓冲操作的函数:

void DoProfile (double* profile, double* &projection, int S, int H, double T)
{
    double* p = projection;

    for (int h = 0; h < H; h++)
    {
        memcpy(p, profile, sizeof(double)*S);
        p += S;
    }

    // should p be deleted here like following?
    // delete p;
    // p = NULL;
}

我不确定,但据我所知,只要不重点,那么最后不需要删除?有人请教育我。感谢。

4 个答案:

答案 0 :(得分:5)

你是对的,在函数调用结束时不需要释放p,因为你没有为它分配任何内存。所以这方面的功能还可以。

但当然,您需要在此功能之外正确管理profileprojection的内存。您还需要确保已分配足够的内存来容纳所有数据,以免造成访问冲突错误。

答案 1 :(得分:4)

没有new,因此不需要delete。内部功能无泄漏。当然,我们不知道外面发生了什么。

BTW,在C ++中,我们倾向于避免使用原始指针(使用标准容器和智能指针)并通过函数参数变换变量(使用return代替,如果需要,重新设计接口)。另外,我不需要在这里通过引用传递指针(double* &projection)。

答案 2 :(得分:2)

提供的代码中没有内存泄漏。因此没有堆分配没有泄漏。

但是你应该小心使用未分配的指针进行复制。

我的建议是避免使用memcpy。使用矢量等

答案 3 :(得分:2)

您只能就delete返回的内容致电new。由于p是算术(重复p += S;)的结果,它使其超过连续块的开头,因此不可能从new返回。绝对不是。