C++是否比C语言更擅长避免内存泄漏?

3

我正在使用一个 C 程序来控制一个电气测试系统。我们的团队最近遇到了严重的内存泄漏问题,考虑在未来的项目中转向使用 C++。那么,C++ 是一个解决方案吗?

C++ 有没有避免内存泄漏的好处呢?


2
这就像问“汽车比自行车好吗”?它们都有各自的优点和缺点。而且在这种情况下,问题似乎不在于语言,而在于代码。 - grooveplex
6
并不完全准确。C++具有特定的功能,使得正确管理内存分配比C更容易。由于C是C++的子集,C++具有更多和更好的功能,并且没有C不具备的任何东西。 - Eric J.
2
C++支持更好的实践,同时保持大部分低级别的能力,但是如果要使用它们,您已经在考虑进行重大重写,并且有一些语言是专门设计来完全处理内存管理的(而不仅仅提供一些更好的功能)。修复代码或转向完全不同的东西可能同样有益。C++有其优势,但它并非魔法。 - Kenny Ostrom
6
C++有它的好处,但听起来你最好还是先找出C代码中的内存泄漏问题。如果你知道该怎么做,在C中编写无内存泄漏的代码是完全可能的(而且并不难)。相反地,如果你不知道该怎么做,即使用C++也可能会写出有内存泄漏的代码。 - user2100815
2
@Eric "缺乏C语言的任何东西" - 这是无稽之谈。举一个例子(还有很多其他例子)- 可变长度数组(VLAs)。 - user2100815
显示剩余11条评论
1个回答

4
是的,C++允许用户定义类型,在它们被销毁时运行代码。这意味着可以使用自动变量来管理分配的内存。
例如,查看std::unique_ptr,它是一个智能指针,当它超出作用域时会自动清理内存。
此外,std::unique_ptr对于使用裸指针没有额外开销,因为它纯粹是语法糖,编译器的优化程序会剥离所有内容并生成几乎相同的手工分配代码。
此外,不仅可以自动清理内存,还可以使用std::unique_ptr来关闭文件!
struct FILE_closer{void operator()(std::FILE* fp) const { if(fp) std::fclose(fp); }};
using unique_FILE = std::unique_ptr<FILE, FILE_closer>;

void func()
{
    // this will close when it goes out of scope
    unique_FILE fp(std::fopen("filename.txt", "w"));

    std::fprintf(fp.get(), "hello %s", "world");

    // no need to close fp here!

}

自动清理自己的字符串!
struct malloc_deleter{void operator()(void* p) const { std::free(p); }};
using char_uptr = std::unique_ptr<char, malloc_deleter>;

void func()
{
    char_uptr s((char*) malloc(128));

    std::sprintf(s.get(), "Hello World Number %d\n", 5);

    std::printf(s.get());

    // no need to call free(s) here!!!
}

4
这是正确的,但是这种功能只有在你实际使用它而不是C风格分配内存时才有用。将现有的C程序进行最小程度的转换到C++是很容易的,但重构它以使用 RAII 和智能指针等则可能会更加困难。(现有C程序存在内存泄漏这一事实并不是一个好迹象。) - ruakh
1
@πάνταῥεῖ 问题在于 C 没有为您管理动态内存的功能,但是 C++ 具有此类功能。这不应该是一个关于一个程序员能否编写没有内存泄漏的 C 代码和另一个程序员能否编写具有内存泄漏的 C++ 代码的争论。这是关于 C++ 具有帮助防止这些泄漏的功能。 - Galik
2
@πάνταῥεῖ 哈哈,好的,你赢了。但我会将它归档到“当然啦”盒子里。所以让我们同意C具有与C++一样出色的内存管理功能。毕竟它们都有Boehm GC.... 我将删除这个答案并撤回我的“重新开放”的投票。如果C程序员真的想相信CC++一样拥有出色的内存管理,他们更加欢迎继续保持这种印象。 - Galik
1
@Aganju 但问题不是关于C++修复糟糕的程序员,而是关于C++具有特定功能。糟糕的程序员是一个转移话题 - 我们不知道他的代码是什么样子,他只是提到了内存泄漏问题。我认为真正的问题是讨论CC++(或任何其他语言)是不明智的,因为太多人对自己钟爱的语言感到防御。 - Galik
1
@Aganju 我的问题是在一种语言中使用不良风格的可能性有多大,以及由此造成的损害程度会有多大。大多数电气工程师不熟悉C++(事实上,他们几乎不了解C);他们通常涉及低级语言。但总的来说,在我看来,C++给程序员提供了比C更多的选项来避免不良风格。 - Red.Wave
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接