【问题标题】:What happens to a pointer dereferenced in the return statement?在 return 语句中取消引用的指针会发生什么?
【发布时间】:2013-04-29 06:12:28
【问题描述】:

这是一个与作业有关的问题。这不是我完成的作业本身。

这是函数的一部分(我认为唯一相关的部分)。

double mean(double* pD, int* sz) {
    double *meanPtr = new double;
    *meanPtr = 0.0;
    return *meanPtr; //how to deal with a memory leak in return statement? does it leak?
}

我担心最后一点。这是否会导致内存泄漏,因为我没有指向 null 或删除指针?

【问题讨论】:

  • 是的。这是内存泄漏,因为您从不使用 delete 释放内存。

标签: c++ pointers return


【解决方案1】:

假设指针部分是固定的,你可以这样做。

double mean(double* pD, int* sz) {
    double *meanPtr = new double;
    *meanPtr = 0.0;
    // Code above is assumed to be a given.
    double result = *meanPtr;
    delete meanPtr
    return result;
}

现代编译器发现result 只是返回值的名称,并为此生成高效的代码。

【讨论】:

    【解决方案2】:

    如果你需要解决这个问题,那么就这样做

    double mean(double* pD, int* sz) {
        double mean = 0.0;
        return mean;
    }
    

    如果这只是一个示例并且您需要使用指针,则返回一个指针。您可以将其包裹在std::shared_ptr 中以防止手动内存控制。

    【讨论】:

    • 谢谢。我将研究 std::shared_ptr。这只是我需要使用指针的一个例子。
    • “你可以将它包裹在std::shared_ptr 中以防止手动内存控制。” - 错字,你的意思是std::unique_ptr
    【解决方案3】:

    它会泄漏吗?

    当然它确实会像地狱一样泄漏。

    如何处理return语句中的内存泄漏

    我无法想象像这样构造代码是有效的场景 - 只是不要这样做。为什么不这样做

    return 0.0;
    

    double foo = 0.0;
    return foo;
    

    ?

    【讨论】:

    • 这是一个很好的观点。除了学术之外,没有充分的理由。我会避免像这样构建代码。
    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 2015-02-24
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2013-11-23
    • 1970-01-01
    相关资源
    最近更新 更多