从函数返回的堆分配
heap allocation returned from a function
The function has a problem:
void myAllo(int mySize, char *myChar )
{
myChar = new char[mySize];
}
堆分配会从myAllo()
返回吗?我不这么认为,因为记忆myChar
意志所指向的当myAllo
返回时被解除分配。
右?
欢迎任何意见。
谢谢
堆分配会从 myAllo(( 返回吗?
不。参数myChar
通过值传递给myAllo()
,因此您只需修改指针的本地副本,而不是调用者上下文中指针的值。
myChar 指向的内存将在 myAllo 返回时解除分配。
没有了。该函数在退出时泄漏分配的内存。要取消分配内存,您需要在 new[]
返回的指针上调用 delete[]
,但当函数退出时,此指针将超出范围。
有几种方法可以解决您的问题。
让调用方传入指向分配内存的指针地址,现在您可以修改调用方指针指向的内容。
void myAllo(int mySize, char **myChar )
{
*myChar = new char[mySize];
}
同样,您的函数可以接受对指针的可变引用
void myAllo(int mySize, char *& myChar )
{
myChar = new char[mySize];
}
返回指向已分配内存的指针
char *myAllo( int mySize )
{
return new char[mySize];
}
比上述所有解决方案更好,而不是返回原始指针,返回智能指针
std::unique_ptr<char[]> myAllo( int mySize )
{
return std::unique_ptr<char[]>( new char[mySize] );
}
堆分配会从 myAllo(( 返回吗?
不。
myChar 指向的内存将在 myAllo 返回时解除分配。
不,这是内存泄漏。
为了获得您分配的内存,您需要将函数编写为
void myAllo(int mySize, char **myChar )
{
*myChar = new char[mySize];
}
并称它
char* pointer;
myAllo(size, &pointer);
或作为
char* myAllo(int mySize )
{
return new char[mySize];
}
并称它
char* pointer = myAllo(size);
void myAllo(int mySize, char *myChar )
{ //note: myChar is a COPY of someone else's pointer
myChar = new char[mySize];
//nobody outside of the function will ever see this change
}
动态内存(新增(仅在显式释放时释放。
myChar 超出范围并自动清理,但指针的"清理">不会释放它指向的任何内存。 这允许我让多个指针指向相同的数据。
void myAllo(int mySize, char *&myChar )
{ //note: myChar is a REFERENCE of someone else's pointer
myChar = new char[mySize];
}
或者更好的是,使用一个向量:
std::vector<char> myAllo(int mySize)
{
return std::vector<char>(mySize);
}
相关文章:
- librdkafka:rd_kafka_assignment 返回分配分区的偏移量 -1001
- 将内存分配返回值强制转换为 TYPE 数组
- 为什么在分配给成员变量之前获取unique_ptr的返回是一个问题?
- 将值分配给从函数返回的右值引用
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 虚函数如何工作,分配后新的返回类型会发生什么?
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- 直接在 C++ 中将值分配给引用返回类型
- 静态分配和动态分配返回不同的答案
- 在函数返回中返回对新分配的shared_ptr的尊重合法吗
- 如何删除新分配的字符,这也是函数返回值?
- 如何使用 RAII 包装返回错误代码的 C 分配
- 有效地分配堆栈对象(由函数的值返回)到堆?
- 在C++中为零大小的分配返回唯一地址背后的基本原理是什么?
- 强制分配返回的对象
- 未分配返回未定义对象类型引用的 C++ 函数的返回值时会发生什么情况
- 具有空异常规范的运算符new在分配返回0时调用构造函数
- 如何分配返回的auto_ptr
- 如何避免在分配/返回时破坏对象
- C++ Visual Studio Express - 分配返回值失败功能