【问题标题】:How is the returned pointer from new/malloc kept in scope when the new/malloc function is exited?当 new/malloc 函数退出时,new/malloc 返回的指针如何保持在作用域内?
【发布时间】:2015-01-15 20:07:51
【问题描述】:

是否创建了某种共享指针?

这是一个 XY 问题。我的最终目的是在我的类中声明一个private 变量,它是一个指针,但在public 函数中分配和填充一个数组并将指针返回到private 变量。我怎样才能合法地将函数中分配的变量保持在范围内,而不仅仅是让它处于某种准状态。下面的代码是否实际上将函数中分配的内存传递给接收返回值的指针,或者内存只是挂起? main() 中对delete 的最终调用是否实际上取消分配returned_data 指向的内存,就好像内存本身已使用以下语句分配:returned_data = new char [15]

最后,我真的需要将其扩展为像char ** 这样的二维指针。我知道编译器需要以某种方式被告知数组的至少一个维度,所以这可能是不可能的。

class MyClass
{
    private:
        char *returned_data;
    public:
        char *fetch_data();
};

MyClass::fetch_data()
{
    char *data_pointer;

    data_pointer = new char [15];

    strcpy(data_pointer, "Hello_World!");

    return data_pointer;
};

main()
{
    MyClass ClassName;

    ClassName.returned_data = ClassName.fetch_data();

    // Do whatever

    delete [] ClassName.returned_data;
};

我刚刚恢复我的编程速度,因为我的编程已经有很多年了,所以代码中可能存在缺陷。这给出了总体思路。这不是我使用的实际代码,因为该代码与我的应用程序中的其他代码混合在一起。欢迎任何更正/建议。

【问题讨论】:

  • 为什么不直接使用std::string 来保存字符串值呢?然后,如果您需要“许多”字符串,std::vector<std::string> 将是一个不错的选择。
  • 函数返回的any局部变量如何保持在作用域内?
  • “范围”适用于名称,而不适用于对象或值。
  • @MikeSeymour:不,范围和生命周期是两个不同的东西。范围是名称可见的程序文本区域。生命周期是对象存在的执行时间的持续时间。如果您将代码行与运行时执行相关联,它们恰好与自动对象密切相关,但它们仍然是截然不同的概念。
  • 这看起来仍然不正确。我无法从main() 访问private 变量,可以吗?

标签: c++ pointers


【解决方案1】:

是否创建了某种共享指针?

不,只是一个指针。它是通过复制它从函数返回的,给另一个具有相同值的指针,即指向相同的东西。

我怎样才能合法地将分配在函数中的变量保持在范围内,而不仅仅是让它处于某种准状态

不是“在函数中分配”;它是从免费存储中分配的,并一直保留到它被delete 明确释放。只需返回指针。分配的数组不关心指向它的指针,如果它们被复制或销毁,也不会改变状态。

下面的代码是否实际上将函数中分配的内存传递给接收返回值的指针,或者内存只是挂起?

它返回一个指向该内存的指针,您可以使用它来访问和释放内存。只要你有一个指向它的指针,它就不是“左挂”。

main() 中对 delete 的最终调用是否实际上解除了 returned_data 指向的内存的分配,就好像内存本身已使用以下语句分配:returned_data = new char [15]

是的。返回的指针与new 的结果具有相同的值(因此指向相同的内存),因此可以使用它(或具有该值的任何其他指针)来删除它。

但是你不想在没有充分理由的情况下玩弄指针——你可能会犯错误,导致内存泄漏甚至更糟。使用智能指针或std::vectorstd::string 等容器,更方便地管理动态内存。

【讨论】:

  • 谢谢。这就说得通了。我会调查std::vectorstd::string。正如我所指出的,我仍在加快这些事情的速度。
猜你喜欢
  • 1970-01-01
  • 2011-05-24
  • 2020-09-03
  • 2011-11-19
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
相关资源
最近更新 更多