相关疑难解决方法(0)

当你在malloc之后没有自由时真正发生了什么?

这已成为困扰我多年的事情.

我们都在学校(至少,我是)教过你必须释放每个分配的指针.不过,我有点好奇,关于不释放内存的实际成本.在一些明显的情况下,就像在malloc循环内部或线程执行的一部分中调用时一样,释放是非常重要的,因此没有内存泄漏.但请考虑以下两个例子:

首先,如果我的代码是这样的:

int main()
{
    char *a = malloc(1024);
    /* Do some arbitrary stuff with 'a' (no alloc functions) */
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这里真正的结果是什么?我的想法是,进程死了,然后堆空间无论如何都没有了,因此错过调用没有任何害处free(但是,我确实认识到无论如何都要将它关闭,可维护性和良好实践的重要性).我对这个想法是对的吗?

其次,假设我的程序有点像shell.用户可以声明类似的变量,aaa = 123并将其存储在某些动态数据结构中供以后使用.很明显,你可以使用一些解决方案来调用一些*alloc函数(hashmap,链表,类似的东西).对于这种程序,在调用之后永远自由是没有意义的,malloc因为这些变量必须在程序执行期间始终存在,并且没有好的方法(我可以看到)用静态分配的空间来实现它.拥有一堆已分配但仅作为流程结束的一部分释放的内存,这是不好的设计吗?如果是这样,有什么替代方案?

c malloc free

515
推荐指数
12
解决办法
11万
查看次数

哪些对象在 Python 解释器退出时不会被销毁?

根据Python文档

不保证为__del__()解释器退出时仍然存在的对象调用方法。

我知道在旧版本的 Python 中,循环引用将是这种行为的示例之一,但是据我了解,在 Python 3 中,此类循环将在解释器退出时成功销毁。

我想知道解释器在退出时不会销毁对象的情况是什么(尽可能接近详尽的列表)。

python garbage-collection

15
推荐指数
2
解决办法
823
查看次数

使用运算符new/malloc分配的内存块是否可以在程序执行结束后持续存在?

可能重复:
退出C应用程序时,是否自动释放了malloc-ed内存?

当我读到关于在C/C++中动态内存分配时分别使用delete/free是多么强制时,我才想到这个问题.我想如果内存分配持续超出我的程序执行终止,那么是的,它是强制性的; 否则,为什么我要担心释放分配的空间?操作系统是否会在进程终止时自动释放它?我是对的吗?我的问题是可以的

int *ip = new int(8);
Run Code Online (Sandbox Code Playgroud)

坚持超越我的计划终止?

c c++ dynamic-memory-allocation

14
推荐指数
4
解决办法
2139
查看次数

Linux是否保证在程序退出时释放malloc'd不同的内存?

我曾经相信它确实存在但是...我无法明确说明它.

man 3 exitman 2 _exit详细说明了进程终止的影响,但没有提到内存泄漏.

Posix走近了:它提到了这个:

  • 在进程被销毁之前,应该在进程中创建的内存映射取消映射.

  • [TYM] [Option Start]在调用进程中映射的任何类型内存块都应取消映射,就像munmap()隐式调用它们取消映射它们一样.[选项结束]

混合这个man 3 malloc:

通常,malloc()从堆中分配内存,并根据需要使用调整堆的大小sbrk(2).当分配大于MMAP_THRESHOLD字节的内存块时,glibc malloc()实现将内存分配为私有匿名映射使用mmap(2).

因此,我们可以得出结论,如果malloc调用,mmap则进程终止可能会进行相应的调用munmap,但是......(a)此POSIX规范中的这个"可选功能"标记令人担忧,(b)这是mmap怎么回事sbrk?(c)Linux不是100%符合POSIX,所以我不确定是否强制将Linux文档与Posix规范混合使用

我问的原因是这个......当图书馆通话失败时,我是否可以退出?

if(somecall() == -1) {
    error(EXIT_FAILURE, errno, "Big fat nasty error.\n");
}
Run Code Online (Sandbox Code Playgroud)

还是我上去栈确保一切都一路攀升到main()free()"d和来电exiterrormain()

前者简单得多.但是为了让前者感到轻松,我想在明确提到的文档中找到它,这不是一个错误,这样做是安全的.正如我所说的那样,事实上,文档明确提到了一些肯定会被清理的保证,但没有提到这个特定的保证让我感到不安.(这不是最常见和最明显的案例吗?首先不会提到这个吗?)

malloc posix memory-leaks terminate language-lawyer

13
推荐指数
2
解决办法
412
查看次数

释放atexit()

在atexit()函数中释放内存有什么意义吗?

我有一个全局变量,在启动后获得malloc.我可以编写一个atexit()函数来释放它,但是当程序退出时系统是否会回收所有内存?

整洁和积极清理自己有什么好处吗?

c memory free atexit

12
推荐指数
6
解决办法
3222
查看次数

程序退出时是否释放堆?

假设我将一些内存malloc到某些指针但在程序退出之前不要释放它们.这个内存是否会在退出时自动释放,或者内存泄漏会继续存在,直到我重新启动计算机?

c

9
推荐指数
1
解决办法
3549
查看次数

在Windows服务停止之前是否应丢弃一次性对象?

这个线程,Dispose()必须显式调用一次性对象.

Windows服务停止后会发生什么?这些对象使用的资源是否会自动释放?或者应该在服务停止之前处理它们:

public void Stop()
{
    cancellationTokenSource.Cancel();
    waitForAllTasksToExit();
    cancellationTokenSource.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

"这是一个很好的做法,处理","他们应该在服务停止时被释放"是我的想法.但参考文档是否有具体的答案?

c# dispose

8
推荐指数
1
解决办法
968
查看次数

C初学者问题:指针算法>完成后清理

我正在慢慢掌握指针.但是我还有一些问题.

使用指针运算时是否可能导致内存泄漏,因为您正在移动指针指向的实际位置?

我的意思是,如果说我向上计数要用char复制字符串char,我是否需要倒数以便C"知道"指针指向的位置?

谢谢弗兰克

c pointers memory-management pointer-arithmetic

5
推荐指数
2
解决办法
1336
查看次数

在C中,是否需要在退出时释放指针?

可能重复:
退出C应用程序时,是否自动释放了malloc-ed内存?

在C中,是否需要在退出时释放指针? 当程序存在时,它是否从指向仍然指向已分配块的指针中释放内存?

它依赖于操作系统吗?

c memory free pointers

4
推荐指数
3
解决办法
3096
查看次数

经常为字符串重新分配内存是一个好习惯吗?

我有格式字符串,我解析它比用输入参数替换格式说明符.现在我考虑如何在替换参数后为这样的结果字符串分配内存.我可以像格式字符串一样分配这个字符串,但是在%s任何长的位置替换其他字符串 都需要在某些不确定的融合中重新分配这个字符串,这使得有必要在代码中进行一些不优雅的计算.所以我认为我可以分配这个从格式字符串创建的字符串,只需char by char,每次重新分配它,如:

/*** for loop traversing next chars in format string ***/
// if new char 
str = realloc(str, sizeof(*str) +1); 
// if %s 
str = realloc(str, sizeof(*str) + strlen(in_str)); 
// if %d 
str = realloc(str, sizeof(*str) + strlen(d_str)); 
Run Code Online (Sandbox Code Playgroud)

c string malloc realloc

2
推荐指数
1
解决办法
582
查看次数

了解Malloc实现

如果malloc即使在退出程序后我没有释放分配的内存,内存是否仍然分配?

它在Ubuntu Linux 14中运行.

c++ memory malloc operating-system

1
推荐指数
1
解决办法
158
查看次数