The function has a problem:
void myAllo(int mySize, char *myChar )
{
myChar = new char[mySize];
}
是å¦ä¼šä»ŽmyAllo()
è¿”å›žå †åˆ†é…?
我ä¸è¿™ä¹ˆè®¤ä¸ºï¼Œå› 为myChar
指å‘的记忆会
在myAllo
返回时被释放。
对å—?
欢迎任何评论。
由于
ç”案 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);
}