是否存在内存泄漏,如果是,为什么?
Is there a memory leak, if yes, why?
>假设我有一个返回char*的函数
char* GetName(int index);
还有另一个函数将 char* 作为输入参数
void PrintName(const char* name);
所以如果我这样做
PrintName( GetName(10) );
是否存在内存泄漏? 如果是,为什么? 这是不使用 std::string 处理此问题的唯一方法吗:
char* name = GetName(10);
PrintName(name);
free(name);
取决于GetName
返回的内容。
但是正如您使用free( name )
我假设它返回动态分配的内存。
那么是的,存在内存泄漏。
C++没有垃圾回收器。如果分配内存,则需要释放它。
或者使用智能指针。或者包装纸。
只要你释放()GetName()返回的内存区域,它就不是内存泄漏。但这一切都取决于 GetName() 内部发生了什么;
从您共享的内容来看,没有什么称为内存泄漏,因为您尚未分配任何内存,这可能会泄漏。 您刚刚指定了可以分配一些内存并将其传递。
所以,简而言之,这完全取决于你在函数中写了什么GetName
PrintName
很简单,每个malloc
都必须与free
匹配,每个new
都必须与delete
匹配,每个new[]
都必须与delete[]
匹配。你没有说GetName
做什么,但我假设它曾经malloc
.在这种情况下,您有内存泄漏,因为您不调用free
。
第二段代码是避免内存泄漏的一种方法,另一种方法是在PrintName
中调用free
(尽管可能不是一个好主意,因为如果没有动态分配的内存,您将无法调用PrintName
)。
当然,正是因为这很难,建议您使用std::string
.
手动执行此操作 alloc/dealloc 会自找麻烦,如果你不小心......所以最好使用类似 std:string 的东西。
话虽如此,如果在 GetName 内部分配了 char *,则需要在外部删除它。你可以把它想象成所有权:GetName 通过返回 char* 来放弃所有权,所以由接收 char* 的人继续处理它。您可以决定 PrintName 获得所有权,然后必须删除它,或者按照您在上一个示例中显示的方式进行操作。
一种更简单的方法是预分配(最好在堆栈上):
char name[TheSizeYouNeed];
PrintName (GetName(10, name));
GetName 会这样做的地方:
char *GetName (int len, char *buf) {
strcpy (buf, "xxx");
return buf;
}
很难从你写的东西中分辨出来。 基本上,如果您不使用malloc
关键字,则不必调用free
。堆栈上分配的内存(即不使用malloc
)将在其范围结束时释放。
但是如果你使用malloc
在GetName
内部分配,NOT 调用free
会导致内存泄漏。
所以它归结为:
- 如果你没有使用
malloc
,它不会泄漏。 - 如果您使用
malloc
并且没有免费呼叫,它会泄漏。
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 如果'C'公开继承'B',B 私下继承'A',为什么我不能在"C"中创建"A"的对象?
- 为什么如果我添加这一行,我的程序会不断询问值
- 为什么如果我从键盘输入EOF克里昂不要在运行窗口打印程序的输出?
- 为什么如果..如果..还有常见的范围?以及list的范围很常见
- 为什么如果说明未输入null时
- 为什么如果(!(cin >> int)) 在第一次迭代中接受十进制数,但不接受其他十进制数?
- 为什么如果条件为false,为什么仍会对语句进行辩护
- 为什么如果我启动几次程序,我的 md5 总是不同的
- 为什么如果使用优化(-O2、-O3),此代码的行为会有所不同
- 为什么如果我删除指向基类的指针,我就会出现内存泄漏
- 为什么如果使用 G++,std::cout 可以转换为 void*
- 为什么 如果类的成员是引用,则复制对象是非法的
- 为什么如果数据已经发送,则选择仅显示文件描述符已就绪
- 为什么如果在c++中继承超过2个类,类的大小会增加1
- 为什么如果输入是字符,然后在c++中存储为整数,那么cin会得到奇怪的值?
- 为什么如果 QWidget 在屏幕上不可见,我只能在运行时向 QWidget 添加元素?
- 我读取了一个char类型的变量,然后打印出ascii代码.为什么如果我按回车键,什么都没有
- 为什么如果我使用引用,在对向量使用运算符 [] 之前不需要尊重向量?