c++教程菜鸟,c++入门操作
C实用技巧(1)--微积分(惊呆了,GetBlogPostIds.aspx)-C博客
c实用技巧(1)复杂的东西太多,写不完。现在还是写点简单的比较好。因为功能的需要,Vczh库3.0被我出格了。为了开发维护遍历,减少粗心的错误,并增强单元测试、回归测试和测试工具,记录了一些开发技巧,以便提供有价值的建议并使他人受益。欢迎喷,菜鸟崇拜。
c指各种语言的软肋,功能强大,陷阱更强。当然,我觉得一门语言用不好完全是程序员的责任,但是因为C里面涉及的概念实在太多了,用好它并不容易。在开发C时,总会遇到各种各样的问题,其中最严重的不外乎与内存有关。由于C语言结构简单,记忆处理效果不佳,但总的来说,成语已经深入人心,不会造成什么难以发现的错误。c不一样。有了虚函数,构造函数,析构函数,复制构造函数和operator=重载,还是有很多人喜欢把一个类直接写到文件流里,或者带到memset里。代码一塌糊涂,他们死不悔改。但是你不能因为噎着就放弃吃饭,就像有人因为C引起的精神问题太多而搞不定,他的团队搞不定,就像说C不好一样。
所以,第一条重点是记忆。当我们处理内存时,首先要避免内存泄漏。内存泄露等不到考试时间。长时间运行程序,观察任务管理器,显然已经来不及了。好在Visual C给了我们一个非常有用的工具:_CrtDumpMemoryLeaks函数。这个函数将在调试模式下,在Visual Studio的输出窗口中打印出所有新的(malloc)但没有删除(free)的内存块的地址、长度、前N个字节的内容以及其他信息。怎么做?其实很简单:
1#define_CRTDBG_MAP_ALLOC
2 #包含标准库
3 #包含crtdbg.h
4 #包含windows.h
五
6intwmain(vintargc,wchar_t*args[])
7{
8//在这里运行程序,在下面的函数调用之前删除所有新的东西
9 _ CrtDumpMemoryLeaks();
10return0
11}
我们只需要在评论中完成我们程序的功能,然后确保我们已经删除了所有应该删除的内容。最后,当_CrtDumpMemoryLeaks()函数被调用时,我们可以打印出被删除的东西。这个方法很神奇,因为你只需要#包含主函数所在的cpp文件,cpp文件中的所有新文件都会被监控,这和通常用宏替换新文件的破方法完全不同。如果使用全局变量,就要小心了,因为全局变量的析构函数是在主函数结束后执行的,所以如果全局变量的析构函数中的某个delete仍然被_ CrtDumpMemoryLeaks函数视为泄漏的资源。当然,我认为可以使用全局变量,但是全局变量的赋值必须在main中完成,释放也一样。除非该全局变量的构造函数没有申请任何内存,否则这也是一个很好的检查方法。
但以上只是告诉你是否存在内存泄漏的一种方式。那么如何避免内存泄漏呢?当然,在设计一些性能要求不比操作系统严格的程序时,可以使用以下方法:
1.如果构造函数创建一个对象并用成员指针变量保存它,那么它必须在析构函数中被删除,并且为了方便起见,不能转移这个对象的所有权。
2.能使用shared_ptr的时候,尽量使用shared_ptr。Shared_ptr只要你没有循环引用,那么这个东西就可以安全的互相传递,你可以在任何容器中添加或者删除它,你可以把它放在任何你想放的地方,这样你就不用再考虑这个对象的生命周期了。
3.不要在有构造函数和析构函数的对象上使用memset(或memcpy)。如果一个对象需要memset,那么memset本身在对象的构造函数中。如果你需要memset一个对象数组,它也在对象的构造函数中。如果你需要memset是一个没有构造函数的复杂对象,那么请为它添加一个构造函数,除非那是别人的API提供的东西。
4.如果一个对象继承了其他的东西,或者一些成员被标记为虚拟的,就不要使用memset。对象是独立的,这意味着父类内部结构的演化不需要为子类负责。有一天,当父类增加了一个字符串成员,并且被子类调用memset时,我会哭。
5.如果你需要为一个对象定义一个构造函数,那么连复制构造函数,operator=重载,析构函数都要写。如果不想写复制构造函数和operator=,那就用空实现私下写,确保任何试图调用这些函数的代码都有编译错误。
6.如果你真的喜欢C语言,请换一个只支持C不支持C的编译器,彻底防止你的C因为误用C而坏掉。
什么是循环引用?如果两个对象通过使用shared_ptr成员变量直接或间接指向对方,则是循环引用。在这种情况下,引用计数将无效,因为即使所有外部shared_ptr都被释放,引用计数也不会为0。
今天到此为止。开心的话过几天再写续集。如果我快乐了很久呢.嗯嗯。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。