Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当new/malloc函数退出时,new/malloc返回的指针如何保留在作用域中?_C++_Pointers - Fatal编程技术网

C++ 当new/malloc函数退出时,new/malloc返回的指针如何保留在作用域中?

C++ 当new/malloc函数退出时,new/malloc返回的指针如何保留在作用域中?,c++,pointers,C++,Pointers,是否创建了某种共享指针 这是一个XY问题。我的最终目的是在类中声明一个作为指针的private变量,但在public函数中分配并填充一个数组,并将指针返回到private变量。我怎样才能合法地将函数中分配的变量保持在作用域中,而不只是让它处于某种准状态。下面的代码实际上是将函数中分配的内存传递给接收返回值的指针,还是内存一直挂起?在main()中对delete的最后一次调用是否实际取消分配返回的\u data所指向的内存,就好像使用以下语句分配内存一样:返回的\u data=new char[1

是否创建了某种共享指针

这是一个XY问题。我的最终目的是在类中声明一个作为指针的
private
变量,但在
public
函数中分配并填充一个数组,并将指针返回到
private
变量。我怎样才能合法地将函数中分配的变量保持在作用域中,而不只是让它处于某种准状态。下面的代码实际上是将函数中分配的内存传递给接收返回值的指针,还是内存一直挂起?在
main()
中对
delete
的最后一次调用是否实际取消分配
返回的\u data
所指向的内存,就好像使用以下语句分配内存一样:
返回的\u 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;
};
我刚刚开始加速我的编程,因为我已经退出了它很多年了,所以代码中可能有缺陷。这给出了总体思路。这不是我正在使用的实际代码,因为该代码与我的应用程序中的其他代码混合在一起。欢迎提出任何更正/建议

是否创建了某种共享指针

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

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

它不是“在函数中分配的”;它是从免费商店分配的,并一直保留,直到它被明确解除分配
delete
。只需返回指针。分配的数组不关心哪些指针指向它,并且在复制或销毁它们时也不会更改状态

下面的代码实际上是将函数中分配的内存传递给接收返回值的指针,还是内存一直挂起

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

main()
中对delete的最后一次调用是否实际取消分配返回的\u数据所指向的内存,就像使用以下语句分配内存一样:
returned\u data=new char[15]

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


但是,您不希望在没有充分理由的情况下处理指针-您可能会犯错误,导致内存泄漏甚至更糟。使用智能指针或容器,如
std::vector
std::string
,可以更方便地管理动态内存。

为什么不直接使用
std::string
来保存字符串值呢?如果您需要“许多”字符串,
std::vector
将是一个不错的选择。函数返回的任何局部变量如何保留在作用域中?“作用域”适用于名称,而不是对象或值。@MikeSeymour:不,作用域和生存期是两件不同的事情。作用域是程序文本中名称可见的区域。生存期是对象存在的执行时间的持续时间。如果您将代码行与运行时执行相关联,它们恰好与自动对象紧密相连,但它们仍然是非常不同的概念。这看起来仍然不正确。我无法从
main()访问
private
变量,可以吗?谢谢。这是有道理的。我将研究
std::vector
std::string
。正如我所指出的,我仍在加快这些事情的进展。