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