通过返回指向简单类型的指针来进行C ++内存管理

时间:2010-12-17 14:27:09

标签: c++ memory-management

我想询问以下情况

int * foo() {
    int fooint = 5;
    return &fooint;
}

int myint = *foo();

它的基础 http://www.functionx.com/cpp/examples/returnpointer.htm

但我想问,如果它是安全的,因为我认为会发生什么

  • fooint在foo()
  • 的范围内初始化
  • 返回fooint的地址,foo()结束
  • foo()中的所有变量都被销毁
  • 因此myint将保存已毁坏的地址中的int值

不是更好吗

int * foo() {
    int * fooint = new int;
    *fooint = 5;
    return fount;
}

int * tmp = foo();
int myint = * tmp;
delete tmp;

5 个答案:

答案 0 :(得分:7)

是的,您不应该因为您提供的原因而完全返回临时变量的地址。第二个变种没问题。

但是,对内置类型使用动态内存分配将非常昂贵。在内置类型的情况下,按价值返回会便宜得多:

int function()
{
    return 5;
}

并且它也不会出错(例如没有内存泄漏的可能性)。

答案 1 :(得分:2)

您的分析正在进行中。我强烈建议你停止阅读该文件。

相反,请查看https://stackoverflow.com/questions/909323/what-are-good-online-resources-or-tutorials-to-learn-c

答案 2 :(得分:0)

问题是为什么要返回指针?正常的做法是返回一个值:

int foo() {
    int fooint = 5;
    return fooint;
}

一般情况下,应尽可能避免使用new进行动态内存分配,而是让编译器为您管理内容。

答案 3 :(得分:0)

你是对的,你不应该返回临时变量的地址,也不应该在函数中新建一些东西然后返回它,期望调用者清理它(当然,除非它包含在这样的东西中)作为boost::shared_ptr)。

因此,对于非POD类型,您的类需要具有临时的复制构造函数(如果您使用C ++ 0x以获得更好的性能,则可能需要移动构造函数)。

答案 4 :(得分:0)

这会导致一个名为dangling pointer的常见问题。

当你没有垃圾收集(或智能指针)等内存管理系统时,你应该总是要求计算引用并在正确的时间在适当的位置使用delete指令,一般的经验法则是:永远不要在不同的范围内共享堆栈变量的地址。