从函数返回的堆分配

heap allocation returned from a function

本文关键字:分配 返回 函数      更新时间:2023-10-16
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);
}