从函数返回的堆分é…

时间:2011-10-17 22:32:58

标签: c++ pointers heap new-operator

The function has a problem: 

void myAllo(int mySize, char *myChar )
{
    myChar = new char[mySize];
}

是å¦ä¼šä»ŽmyAllo()返回堆分é…? 我ä¸è¿™ä¹ˆè®¤ä¸ºï¼Œå› ä¸ºmyChar指å‘的记忆会 在myAllo返回时被释放。

对å—?

欢迎任何评论。

由于

4 个答案:

答案 0 :(得分:8)

  
    

是å¦ä¼šä»ŽmyAllo()返回堆分é…?

  

没有。å‚æ•°myChar通过值传递给myAllo(),因此您åªéœ€ä¿®æ”¹æŒ‡é’ˆçš„本地副本,而ä¸æ˜¯è°ƒç”¨è€…上下文中指针的值。

  
    当myAllo返回时,myChar指å‘的内存将被释放。

  

å†æ²¡æœ‰ã€‚该函数在退出时会泄æ¼å·²åˆ†é…的内存。è¦å–消分é…内存,需è¦åœ¨delete[]返回的指针上调用new[],但当函数退出时,此指针超出范围。


有几ç§æ–¹æ³•å¯ä»¥è§£å†³æ‚¨çš„问题。

让调用者传入指针的地å€ï¼Œè¿™å°†æŒ‡å‘已分é…的内存,现在您å¯ä»¥ä¿®æ”¹è°ƒç”¨è€…指针所指å‘的内容。

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] );
}

答案 1 :(得分:2)

  

是å¦ä¼šä»ŽmyAllo()返回堆分é…?

没有

  当myAllo返回时,myChar指å‘的内存将被解除分é…。

ä¸ï¼Œè¿™æ˜¯å†…存泄æ¼ã€‚

答案 2 :(得分:2)

为了获得你分é…的内存,你需è¦å°†å‡½æ•°å†™ä¸º

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);

答案 3 :(得分:1)

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);
}