微妙的内存泄漏,是这种常见的做法
Subtle Memory Leak, and is this common practice?
我想我可能在这里创建内存泄漏:
void commandoptions(){
cout<< "You have the following options: n 1). Buy Something.n 2).Check you balance. n3). See what you have bought.n4.) Leave the store.nn Enter a number to make your choice:";
int input;
cin>>input;
if (input==1) buy();
//Continue the list of options.....
else
commandoptions(); //MEMORY LEAK IF YOU DELETE THE ELSE STATEMENTS!
}
inline void buy(){
//buy something
commandoptions();
}
假设commandoptions刚刚执行了程序的第一次运行。用户选择'1',这意味着buy()子例程由commandoptions()子例程执行。
buy()执行后,它再次调用commandoptions()。
第一个commandoptions() 是否返回 ?还是我刚刚造成了内存泄漏?
如果我创建的子程序除了调用自己什么都不做,它将导致stackoverflow,因为该子程序的其他"循环"永远不会退出。我正在做/接近做这件事吗?
请注意,我使用inline
关键字购买…这有什么区别吗?
EDIT:我不能相信我没有想到要使用循环,但是谢谢,我学到了一些新的术语!
内存泄漏是您使用new
分配一些内存的地方,如下所示:
char* memory = new char[100]; //allocate 100 bytes
然后你忘记了,之后用这个内存来delete
内存
delete[] memory; //return used memory back to system.
如果您忘记delete
,那么当您的程序正在运行时,您将把此内存作为在使用,而不能用于其他事情。鉴于内存是一种有限的资源,例如,在程序不终止的情况下执行数百万次这样的操作,将导致没有剩余的内存可用。
这就是为什么我们自己打扫卫生。
在c++中,你会使用像RAII这样的习惯用法来防止内存泄漏。
class RAII
{
public:
RAII() { memory = new char[100]; }
~RAII() { delete[] memory }
//other functions doing stuff
private:
char* memory;
};
现在可以使用这个RAII类了,如下所示
{ // some scope
RAII r; // allocate some memory
//do stuff with r
} // end of scope destroys r and calls destructor, deleting memory
你的代码没有显示任何内存分配,因此没有可见的泄漏。
你的代码似乎有无尽的递归,没有一个基本情况来终止递归。
内联关键字不会导致内存泄漏。
如果这是你所有的代码,不应该有内存泄漏。它看起来确实像无限递归。如果用户输入'1',则在buy()
内部再次调用commandoptions()
。假设他们在上面输入"1"。无限重复,最终会崩溃,因为堆栈太深了。
即使用户没有输入'1',你仍然在else语句中在commandoptions()
中再次调用commandoptions()
,这将得到完全相同的结果——由于无限递归而崩溃。
我没有看到内存泄漏与确切的代码给出然而。
这基本上是一个没有基本情况的递归。因此,递归将永远不会结束(直到耗尽堆栈空间)。
对于你想要做的事情,你最好使用循环,而不是递归。
并回答您的具体问题:
- 不,
commandoptions
不返回。 - 如果您使用非常广泛的内存泄漏定义,那么这是内存泄漏,因为您正在创建堆栈帧而不会再次删除它们。但大多数人(包括我)都不会给它贴上这样的标签。
- 是的,你最终确实会导致堆栈溢出。
-
inline
关键字在此不会产生影响。
这与memory leak
无关,无论input
的值是多少,您都在无限调用commandoptions
函数,这将导致堆栈崩溃。在commandoptions
函数中需要一些退出点
这里没有内存泄漏。真正发生的(至少在你的代码片段中看起来是这样的)是你进入了一个无限循环。如果尾部调用优化没有启动或编译器不支持,您可能会耗尽堆栈空间(虽然很难看到您的调用是否实际上处于尾部位置)。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 是否可以锁定应用程序中常见控件使用的内存?
- 微妙的内存泄漏,是这种常见的做法
- 内存池背后的常见实现细节是什么?