从函数返回动态数组后将其删除
Deleting a dynamic array after it has been returned from a function
我是记忆泄漏的C++和偏执的新手。我将把我的代码剥离到重要的部分:
如果我有这样的函数:
char * myString = "Discombobulate";
char * ToUppercase()
{
int length = strlen(myString);
char * duplicateString = new char [length];
strcpy(duplicateString, myString);
//char arithmetic to turn every letter in duplicateString to uppercase
return duplicateString;
}
显然,我需要执行 delete[] 以避免内存泄漏。现在我想知道的是我是否可以在main()中进行删除,如下所示:
int main () {
char * result = Upper();
std::cout << result << std::endl;
delete[] result;
}
这能正常工作吗?这样做有什么好处吗?
现在我想知道的是我是否可以在main()中进行删除
是的,你可以而且你应该。
BTW1:考虑使用std::string
,std::vector
智能指针,以避免这种手动内存管理,因为它是c ++。
顺便说一下2:
char * duplicateString = new char [length];
应该是
char * duplicateString = new char [length + 1];
最后一个位置将用于终止空字符' '
。
这能正常工作吗?
是的。只要它是有效的指针,您就可以在调用 new
的函数之外delete
它。你应该吗?井。。。
这样做有什么好处吗?
是的。这是不好的做法。您正在函数中分配资源,并期望调用方清理它们。正如评论中的人所解释的那样,这与RAII背道而驰。除了使用std::string
的建议(确实使用它)外,您还可以使用std::unique_ptr
和朋友而不是原始指针。
是的,您可以按照自己的方式删除它...顺便说一下,您还可以为指针分配内存并将其作为参数传递给函数,并在它从函数返回后将其删除。
char * duplicateString = new char [length + 1];
ToUppercase(char* duplicateString );
if( duplicateString ){ delete []duplicateString ; duplicateString = NULL;}
相关文章:
- 你能帮我解决删除数组 c++ 中重复值的挑战吗?
- 删除[i] 数组和删除数组 [i] 之间的区别
- 如何实现删除数组的功能?
- 删除数组 c++ 崩溃问题
- 如何删除数组列表中的元素
- C++删除数组只会解除分配第一项
- 删除数组成员的更好方法是什么?
- 如何使用 deleteEntry 函数 c++ 删除数组中的单个字符串
- 删除数组中所有出现的数字 C++
- C++ 删除数组时检测到堆损坏
- 不允许删除数组的一部分,为什么
- 如何删除数组中第一次出现的值
- 当我删除数组时,指针在哪里?指向数组的指针与数组中的元素之间的区别
- 尝试用C 中的空地址(而非null)删除数组指针
- 为什么 std::remove 不删除数组的最后一个元素
- 如何使用c++删除数组中的一些值
- 仅删除数组的第一个元素
- 删除数组时断言失败
- 如何并行删除数组中的零值
- 访问指针数组/通过另一个指针并删除数组中的单个元素而不删除第一个指针或整个数组