如何学习以正确的方式编写C ++

时间:2010-05-16 00:19:44

标签: c++ c memory gcc

我一直在用C / C ++为我的学术课程编程,并且给人的印象是我很好地掌握了它。但最近我不得不在蓝牙应用程序中工作,该应用程序在Linux机器和嵌入式系统中具有服务器和客户端实现。我学习了bluez蓝牙API,套接字/网络编程并对其进行了编码。

然而,我遇到了许多内存泄漏和分段错误以及其他内存相关错误的问题。随着代码变得越来越复杂,我几乎失去了对指针,线程和套接字的控制。这让我想知道我有很多东西要学习,他们没有在基本的C / C ++书中说。所以我想要提供可用的资源,这些资源将有助于在C / C ++中以专业的方式更好地编写代码。特别是对于Linux / Mac环境(gcc编译器)。

编辑:由于它正在创建的混乱,将C更改为C ++。

10 个答案:

答案 0 :(得分:5)

这个问题太大了,太大了。

简而言之,除了继续前进之外别无他法。你会受到段错误的打击很多次。你唯一能做的就是保持专注,不知疲倦地捕获这些bug,并始终相信你的代码中的错误,而不是编译器或你使用的一些实体库。如果您遇到困难,请在此处发布具体的,狭隘的问题,并附上相关代码。那我们会帮助你的。

现在,从这里开始,它实际上取决于您使用的语言:C还是C ++?这些是如此不同的话是不够的。如果它是C ++,那么我将给出的第一个建议是始终使用RAII 。如果它是你正在使用的C,那么总是要意识到拥有该指针的内容,它何时何地释放它,最重要的是指针指向哪里。此外,始终初始化您的数据,尤其是指针。除了表现不佳之外,别担心它的性能。

就是这样。除此之外,发布您的具体问题,我们将解决它们。这是学习的正确方法。

答案 1 :(得分:4)

如果你malloc忘了free,你就会发生内存泄漏,除了它们还需要知道什么?这一切都与设计模式有关,但这些与语言无关......

Segfaults当然是另一个故事......如果真的想要知道如何正确编码C,那就去拿一份C99标准。除非我确切地知道标准所说的内容,否则我无法对用C语写的任何东西开始部分自信。 C ++也是如此。

编辑如果你只是C或C ++的初学者,你可能想先读一本书,否则标准可能很难理解。

答案 2 :(得分:3)

我在代码中处理内存和正确性问题的开始建议不是从语言开始,而是从一般的软件实践开始:

  • 一次编程,然后测试。
  • 测试,测试,测试!在可行的情况下进行单元测及早和逐步发现错误。

我通过艰苦的经验发现C和C ++肯定会惩罚你,没有测试你的代码就会越久。我敢打赌你已经尝试调试足够的这些问题,以便知道在未经测试的代码库中找到一个非常重要的问题可能会令人困惑和痛苦。

对于那些可以帮助你发展学科的书籍,我建议作为一个起点The Pragmatic Programmer,Andrew Hunt和David Thomas,Addison-Wesley Professional,1999。

我特别针对C和C ++的提示是:

  • 除非您需要,否则不要动态分配。
  • 像鹰一样观察动态内存分配(malloc / new)。确保你已经确切地想出了谁拥有这些对象,并且一旦创建它们就负责删除它们 - 即使在例外的情况下! (这就是资源获取初始化的地方。)设计你的代码,使这种所有权合乎逻辑且可预测。
  • 使用Valgrind,Purify和其他此类工具来帮助捕获和诊断内存问题。

Stack Overflow上的两本书Definitive C++ Book Guide and List(一个很棒的列表,顺便说一下!)我认为这些书对你来说最有帮助:

答案 3 :(得分:1)

我无法评论C,但使用C ++,获得一本好书[{3}}并从较小的项目开始是学习正确编码技术的良好开端。

答案 4 :(得分:1)

我从你的评论中看到你认为C和C ++中的内存管理是相同的。事实上,这是一个非常不同的故事。

感谢C ++中的exceptions,您可以获得一种新的更好的方法来管理错误检查和资源管理。标准做法称为RAII (Resource Acquisition Is Initialization).


首先阅读此主题:whats-the-difference-between-c-and-c

然后是一些好书:the-definitive-c-book-guide-and-list

答案 5 :(得分:1)

很多事情都是通过经验来学习的。您可以阅读和阅读,但很多时候您只需要深入了解。我要说的一件事是使用符号调试器。设置断点并准确查看所有变量将会加速发现问题并将其修复10倍。

答案 6 :(得分:0)

我认为@James McNellis是最好的一点。每种语言都有自己的优点和缺点。良好的编程正在利用特定工具的这些方面以您能够以最稳定和最优化的方式完成工作。只有在编写了许多程序之后,您才能预见何时是使用某种方法的最佳时机,这是您想要和正在寻求的编程智慧。所以继续编写程序并继续努力使它们更好。

答案 7 :(得分:0)

对于资源管理和避免内存泄漏,RAII模式和智能指针在C ++中是必不可少的。浏览Marshall Cline的C++ FAQ Lite对于学习该语言的细微差别也是非常宝贵的。

答案 8 :(得分:0)

我认为在早期识别并接受以下内容非常重要:

0。)C ++不是C的超集,C和C ++是两种不同的语言,具有明显的差异。

1。)C和C ++是强大的语言,但它们对新手程序员并不是特别友好。

2.)成功的C / C ++程序员永远不会停止学习。探索新材料并回顾您已经学到的知识对于使用C或C ++进行编程至关重要。

3.使用C或C ++编程不仅需要语言知识,还需要了解语言背后的概念,通常用于语言开发的工具(调试器,构建工具链,编译器,库/ apis等。)

答案 9 :(得分:0)

首先,正如所指出的,C和C ++是两种不同的语言。 C ++是作为C的超集创建的,但是从那时起两种语言都在发展,C中允许的一些结构不在C ++中,反之亦然。

如果您想学习某种语言,请先选择其中一种语言并专注于此语言。你不能在学习另一个的同时正确地学习它们,因为你只会让它们混淆(除非你的大脑与我的大脑有很大不同;)。)。

你很快就会发现编程有三个不同的领域:

  • 技术:如何用您选择的语言实现您的想法(例如C ++功能面向对象或通用编程)
  • 设计模式:代码/依赖关系组织的高级视图(如何解耦代码,以便在整个项目中改变一点点不会产生影响)
  • 算法:了解算法和数据结构,了解复杂性(时间/空间)是什么

当然,真正的困难在于3个区域彼此互动,因此您无法真正了解它们,这就是为什么您需要选择一种编程语言来试验最后两个。但是,不要只关注技术,学习C或C ++标准不会让你成为一名优秀的程序员,它会让你成为一名需要建筑师来指导他的工作的优秀技师。

由于互联网的出现,您可以在那里搜索您的错误,并在您自己找不到的时候在网站上询问(例如这个),不管是技术错误(编译错误,程序崩溃) )或设计/算法错误(虽然这些很难发现,因为它通常起作用,它只是不优雅或缓慢)

最后一句话,并不是因为它是唯一可行的方式。你应该尝试各种各样的方式(探索各种范式),这样你就可以增加你的经验,并且对于什么样的任务,当它们适合或笨拙等等时,能够很好地理解范式......