2010-05-16 24 views
2

我在C/C++中为我的学术课程进行了很多编程,并且对它有很好的理解。但最近我不得不在蓝牙应用程序中工作,该应用程序在Linux机箱和嵌入式系统中具有服务器和客户端实现。我学习了蓝牙蓝牙API,套接字/网络编程并对其进行了编码。如何学习以正确的方式编程C++

但是我遇到了很多的内存泄漏和段错误和其他内存相关的错误沿way.as问题的代码变得更加复杂我所有,但失去了指针和线程和插座的控制。这让我想知道我有很多东西要学习,他们没有在基本的C/C++书籍中说过。所以我想问一些可用的资源,这些资源将有助于在C/C++中以专业的方式更好地编写代码。尤其是Linux/Mac环境(gcc编译器)。

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

+21

第一步为了学习编程C或C++,“正确的方式”是停止将这一对作为单一语言来思考,并意识到两者是完全不同的,特别是在编写好的代码时。 – 2010-05-16 00:22:35

+0

@james是你正确的指出了我。我主要是指处理内存和线程。 C是那里bcoz我认为C++中的大部分功能都来自C,因为C是我业余思维方式中C++的一个子集。很多时候我发现C++项目中还有一些纯C代码。但要明确它是C++我想更好地学习。 – sfactor 2010-05-16 00:29:48

+1

这是一个非常非常不好/主观的问题,应该删除。我如何正确地选择我的鼻子? – 2010-05-16 01:02:56

回答

4

如果你malloc忘记free,你有内存泄漏,你还需要知道什么才能避免它们?这是关于设计模式,这些都是相当语言无关,但...

段错误当然是另一个故事......如果你真的想知道如何正确代码C,去拿起C99副本标准。除非我确切地知道标准对此所说的内容,否则我不会对我在C中编写的任何内容有部分信心。对于C++来说几乎是一样的。

编辑如果您只是C或C++的初学者,您可能需要先阅读一本关于它们的书,否则标准可能很难理解。

+0

当然,我知道我malloc后释放。但我确信任何尝试编写C++任何复杂程序的人都会遇到内存泄漏,因为其他因素会发挥作用,如全局变量和函数指针以及线程等等。我只是想学习更好的做法,以尽量减少这种情况。 – sfactor 2010-05-16 00:41:54

+0

@sfactor,C++注释在这种情况下是非常有用的,我认为:http://www.icce.rug.nl/documents/cplusplus/cplusplus.html 它解释了许多C++中的典型危险,尽管很多从C继承的东西,它没有解释,也许K&R对此会有好处。 嗯,同样,线程是不同的野兽,C没有对它们的本地支持,所以它取决于你如何正确处理它们的实现。基本上只要你的管理正确锁定你就好。线程在任何语言中都是有问题的。 – 2010-05-16 01:01:29

1

我不能评论C,但用C++,得到一本好书SO definitive book guide,从较小的项目开始是学习正确的编码技术的良好开端。

0

我认为@詹姆斯麦克奈利斯是最好的一点。每种语言都有其优点和缺点。良好的编程正在利用特定工具的这些方面以最稳定和最优化的方式完成工作。只有在编写了很多程序之后,你才能预见何时是使用某种方法的最佳时机,这是你想要和正在寻求的编程智慧。因此,不断编写程序并不断努力让它们变得更好。

5

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

总之,除了继续前进之外,您几乎没有什么可做的。你会被段错误多次击中。你唯一能做的就是保持焦点,不知疲倦地捕捉这些错误,并始终相信错误出现在你的代码中,而不是在编译器或你使用的一些固定的库中。当您遇到困难时,请在此附上相关代码,在此发布具体而狭窄的问题。那么我们会帮你的。

现在,从这里开始,它取决于您使用的语言:C还是C++?这些是如此不同的词汇是不够的。如果它是C++,那么我会给出的第一个建议是始终使用RAII 。如果你使用的是C,那么你总是要意识到拥有这个指针的是什么,它何时何地释放它,最重要的是指针指向哪里。此外,始终初始化您的数据,特别是指针。在时间到来之前不要在意性能,除了大哦表现。

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

0

对于资源管理和避免内存泄漏,RAII模式和智能指针在C++中是必不可少的。浏览马歇尔克莱因的C++ FAQ Lite也是学习语言细微差别的宝贵资料。

3

我对内存和正确性的问题在你的代码打交道的出发建议开始不与语言,但与软件实践一般:

  • 编程一次,然后测试。
  • 测试,测试,测试!尽可能进行单元测试。尽早并逐步捕捉错误。

我发现通过辛苦的经验,C和C++一定会惩罚你,没有测试代码就走的时间越长。我敢打赌,你已经试图调试足够的这些问题,以知道在一个未经测试的非平凡大小的代码库中发现问题可能会令人费解和痛苦。

的书籍,这将有助于你制定纪律沿着这些线路,我建议作为一个起点The Pragmatic Programmer,安德鲁·亨特和大卫·托马斯,Addison-Wesley出版社专业,1999年

提示我有具体的C和C++是:

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

堆栈溢出的Definitive C++ Book Guide and List的两本书(!一个优秀的名单,顺便说一句),我认为这将有助于你沿着这些线路大多是:

  • Thinking in C++ Vol. 2,布鲁斯·埃克尔和Chuck佳佳,Prentice Hall出版社, 2003
  • Accelerated C++,安德鲁·科尼格和芭芭拉哞,Addison-Wesley出版社专业,2000
1

很多这将是从经验中学习。你可以阅读和阅读,但很多时候你只需要潜入。我要说的一件事就是使用符号调试器。设置断点并准确查看所有变量将加速发现问题并将其修复10倍。

0

我认为,承认并接受早期以下是很重要的:

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

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

2.)成功的C/C++程序员永远不会停止学习。探索新材料并回顾你已经学到的知识对于用C或C++进行编程至关重要。 3.)用C或C++进行编程不仅需要掌握语言知识,还需要掌握语言背后的概念知识,通常用于开发语言的工具(调试器,编译工具链,编译器,库/ apis等)。

0

首先,正如它已经指出的那样,C和C++是2种不同的语言。 C++是作为C的超集而创建的,但是从那时起这两种语言都在发展,并且C中允许的一些构造不在C++中,反之亦然。

如果您想学习一门语言,请先选择其中一个并专注于此。你不能正确地学习他们中的任何一个,同时研究另一个,因为你只会混淆他们(除非你的大脑与我的组织非常不同))。

你很快就会知道有编程3个不同的领域:

  • 工艺:如何实现你心目中的您所选择的语言(C++功能的面向对象的或例如泛型编程)设计模式:代码/依赖关系组织的高级视图(如何分离代码,以便在整个项目中改变一个微小的位并不会产生影响)
  • 算法:了解算法和数据结构,理解什么复杂性(时间/空间)是

当然,真正的困难在于3个区域相互影响,以至于无法真正了解它们,这就是为什么您需要选择一种编程语言才能够尝试使用最后两个。但是,不要仅仅关注技术,因为用心学习C或C++标准并不会让你成为一名优秀的程序员,它会让你成为一名优秀的技术人员,需要架构师来指导他的工作。

由于互联网的出现,您可能会在那里搜索您的错误并在网站上询问(例如这个),当您无法自己找出时,无论是技术错误(编译错误,程序崩溃)或设计/算法错误(虽然由于它通常工作很难察觉,但它只是不雅或慢)

最后一句话,这不是因为它的工作原理,它是唯一的方法。你应该试着想出各种方式(探索各种范例),这样你就可以增加你的体验,并获得什么范例用于什么任务,什么时候适合或笨拙等等的良好感受......