从函数返回的堆分配

dtu*_*y68 2 c++ heap pointers new-operator

The function has a problem: 

void myAllo(int mySize, char *myChar )
{
    myChar = new char[mySize];
}
Run Code Online (Sandbox Code Playgroud)

堆分配是否会从myAllo()?返回?我不这么认为,因为指向的内存myChar将在myAllo返回时被释放.

对 ?

欢迎任何评论.

谢谢

Pra*_*ian 8

是否会从myAllo()返回堆分配?

不是.参数myChar是通过值传递的myAllo(),因此您只需修改指针的本地副本,而不是调用者上下文中指针的值.

当myAllo返回时,myChar指向的内存将被释放.

再也没有.该函数在退出时会泄漏分配的内存.要取消分配内存,您需要调用delete[]返回的指针,new[]但是当函数退出时,此指针超出范围.


有几种方法可以解决您的问题.

让调用者传入指针的地址,指向已分配的内存,现在您可以修改调用者指针所指向的内容.

void myAllo(int mySize, char **myChar )
{
    *myChar = new char[mySize];
}
Run Code Online (Sandbox Code Playgroud)

同样,您的函数可以接受对指针的可变引用

void myAllo(int mySize, char *& myChar )
{
    myChar = new char[mySize];
}
Run Code Online (Sandbox Code Playgroud)

返回指向已分配内存的指针

char *myAllo( int mySize )
{
    return new char[mySize];
}
Run Code Online (Sandbox Code Playgroud)

优于所有上述解决方案,而不是返回原始指针,返回智能指针

std::unique_ptr<char[]> myAllo( int mySize )
{
    return std::unique_ptr<char[]>( new char[mySize] );
}
Run Code Online (Sandbox Code Playgroud)

  • @MooingDuck不,`std :: unique_ptr`对`unique_ptr <Type []>`有一个部分特化,它在析构函数中调用`delete []`. (3认同)