返回指针的最佳方法 < >我已经看到至少5个C++教程站点,它们以这样的方式返回指针: int* somefunction(){ int x = 5; int *result = &x; return result; }

返回指针的最佳方法 < >我已经看到至少5个C++教程站点,它们以这样的方式返回指针: int* somefunction(){ int x = 5; int *result = &x; return result; },c++,C++,这不是一个非常非常糟糕的主意吗?我的逻辑告诉我,返回指针的值可以随时被覆盖。我宁愿认为这是正确的解决方案: int* somefuntion(){ int x = 5; int* result = new int; *(result) = x; return result; } 然后离开调用函数删除指针。还是我错了?是的,第一个选项将返回一个悬空指针,并导致未定义的行为。您的第二个选项是正确的,尽管您可以只写: int* somefuntion(){ r

这不是一个非常非常糟糕的主意吗?我的逻辑告诉我,返回指针的值可以随时被覆盖。我宁愿认为这是正确的解决方案:

int* somefuntion(){
    int x = 5;
    int* result = new int;
    *(result) = x;
    return result;
}

然后离开调用函数删除指针。还是我错了?

是的,第一个选项将返回一个悬空指针,并导致未定义的行为。您的第二个选项是正确的,尽管您可以只写:

int* somefuntion(){
    return new int(5);
}
或者在方法中有一个
静态
变量并返回其地址。

不要忘记 删除
调用方法后的指针,这是正确的。

您对问题的直觉是正确的-UB是结果。但是,您提出的解决方案不太好。“让调用方删除它”极易出错,是不明智的。相反,将其返回到某个拥有类中,该类正确地封装了它的预期用途-最好是
std::unique\u ptr
您的问题将几个不同的问题混合到一个问题中。实际上,这里的主要问题是你是否真的需要这种混合物

没有“返回指针”这样的事情。你不能仅仅因为想“返回指针”就“返回指针”。返回指针是出于某些特定的原因而进行的,该原因将决定如何进行返回,以及为了确保返回指针正常工作需要执行哪些操作

您的原始示例并没有真正说明这一点,因为在您的原始示例中,根本没有返回指针的有意义的理由。看起来您只需返回一个
int

例如,在许多情况下,您希望返回指针,因为它是指向动态分配对象的指针,即生命周期不受语言范围规则约束的对象。注意,本例中的临时关系的工作方向相反:您需要一个动态对象->您必须返回一个指针。这样,而不是相反。在您的示例中,您似乎在反向使用它:我想返回指针->我必须动态分配对象。后一种推理从根本上说是有缺陷的,尽管人们可能会发现它的使用频率比预期的要高

如果您真的需要一个动态分配的对象(正如我前面所说,主要原因是重写该语言基于作用域的生存期规则),那么内存所有权问题就成了一个问题。为了知道何时可以/必须释放此内存以及谁必须释放它,您必须实现独占(随时指定一个所有者)或共享(如引用计数)所有权方案。可以使用原始指针完成,但更好的方法是使用库提供的各种智能指针类

但在许多情况下,您也可以返回指向非动态对象(静态或自动)的指针,这是非常好的,假设这些指针的生命周期与它们指向的对象的生命周期相同或更短

P>换句话说,返回指针的推理在C和C++之间并没有什么不同。它更多地与设计/意图相关,而不是与语言相关。正是C++提供了更多的工具来让你的生活更轻松,一旦你已经决定返回一个指针。(这有时会成为C++程序员过度使用隐藏指针的激励)。
在任何情况下,这都是您试图实现的功能的问题。一旦您知道了这一点,您就可以很好地决定是否应该“返回指针”。如果您最终决定返回指针,它将帮助您选择正确的返回方法。这就是它的工作原理。试着向后思考(“我只想返回一个指针,但我还没有真正的理由”)只会产生学术上无用的答案,在某些特定情况下,每一个答案都可能被证明是“错误的”。

是的,第一个示例并不好,因为您将返回一个指向内存的指针,系统可能会将其用于其他用途。第二个例子更好,但仍然存在内存泄漏的风险,因为某个函数的调用方不清楚删除指向的内存是他们的责任

这样可能更好:

std::unique_ptr<int> somefunction(){
    int x = 5;
    std::unique_ptr<int> result( new int );
    *result = x;
    return result;
}
std::unique_ptr somefunction(){
int x=5;
std::唯一的ptr结果(新int);
*结果=x;
返回结果;
}

这样,独特的ptr将负责删除您新添加的内存,并有助于消除潜在的内存泄漏。

正如您所怀疑的和其他人所澄清的,第一种方法显然是错误的。尽管C++是一种系统语言,但在某些情况下,您可能需要这样做(它会返回堆栈上的特定位置,在大多数系统上),但几乎永远都不会正确。第二种方法更明智


<>但是,C++中不应鼓励任何方法。C++的一个主要观点是,现在你有引用和异常,而不是C的指针。所以你所做的就是返回一个引用,并允许新的在内存分配失败的情况下向栈中抛出异常。第二个是正确的。@Mohammad:第二个没有错。但是它是正确的,只是稍微延伸了一点(可行的话会更好)。哇,那些教程真的告诉你这样做吗?你能提供一些链接吗?@MFONTANI:lol yip。我可以给你看我发现的最新的一个:哦,上帝。。。这个(在同一个网站上)更糟:谢谢你的回答。为了简洁起见,我只使用了
int*
。大多数情况下,我们都理解指针的一般用法。@user1166877:是的,但如果您提出一个不太抽象的示例,我们将能够提供不太抽象的推理来说明应该如何操作。-1。C++标准库中满是内存分配。雌鹿