如何学习C++程序代码在内存分配中的意义?

发布于 2022-09-04 05:52:31 字数 4933 浏览 26 评论 0

我不是计算机专业的,我现在学习C/C++,关于内存分配的我不是很懂,好像要补好多底层知识,比如对程序运行在内存中的活动不是很明白,程序在内存中是如何分配的,具体哪些在所谓的上,哪些在上。比如:gdb调试codedump文件时,我不知如何定位到问题所在,一大堆错误。只知道看到跟我写的代码有关的部分去追踪一定没错了。从bt跟踪出来的那些错误信息,从下往上看,分别代表的是什么东西?
上面只是说一个例子,就是这方面我不懂,也不知如何去学习。希望大家给我推荐一些非科班能看懂的书籍,不要动不动就 计算机体系结构,深入理解计算机系统...等等这类,这些书我尝试去看过了,看不懂~
比如下面这一段,bt后一共有22处提示,但我应该一开始从哪里追踪?应该是第#1处吗?,第#1,#2处就是具体实现业务的方法,为什么它会排在上最面?:

#0  0x000000368c09c0d3 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const ()
   from /usr/lib64/libstdc++.so.6
#1  0x000000000059fccb in SongIndexUpdate::BuildSearchIndex (this=0x1b584e0, strlist=std::vector of length 89, capacity 128 = {...}, 
    item=...) at SongIndexUpdate.cpp:1209
#2  0x000000000059d533 in SongIndexUpdate::FormatCommitData (this=0x1b584e0, line=
    "Classic Jazz - Black Orpheus|31907DEDB85782ADD036F687AB5E5CAB|0|4015213|128|mp3|251|||127|0|100|1030544|Classic Jazz|Black Orpheus|2|1|0|0|D0A5848270229311DAC2D7BADCD4949D|10037541||0|1|2|0|0|0||0|185"..., item=..., num=5, maxOwnerCount=1882587, M4AFilter=0, type="song")
    at SongIndexUpdate.cpp:953
#3  0x000000000059a6b8 in SongIndexUpdate::FormatUpdateData (this=0x1b584e0, line=
    "Classic Jazz - Black Orpheus|31907DEDB85782ADD036F687AB5E5CAB|0|4015213|128|mp3|251|||127|0|100|1030544|Classic Jazz|Black Orpheus|2|1|0|0|D0A5848270229311DAC2D7BADCD4949D|10037541||0|1|2|0|0|0||0|185"..., item=..., num=5, index="song", maxOwnerCount=1882587, HitID="", 
    type="song", needEncode=false) at SongIndexUpdate.cpp:777
#4  0x0000000000597ead in SongIndexUpdate::UpdateToService (this=0x1b584e0, 
    filename=0x7f2c20ca0538 "/data/ops/Update-1.4.60/bin/../data/IndexUpdate/SongIncrDataTmp.txt", index="song", type="song", 
    cluster="master", flag=1, needEncode=false) at SongIndexUpdate.cpp:562
#5  0x00000000005931b0 in SongIndexUpdate::OnRecvImportStrings (this=0x1b584e0, req=..., rsp=..., needEncode=false)
    at SongIndexUpdate.cpp:183
#6  0x00000000004de823 in CNetCMDImpl::OnHTTPRequest (this=0xb56700, req=..., rsp=...) at CNetCMDEx.cpp:50
#7  0x00000000004d46ee in CNetCMDImpl::OnHTTP2UDPRequest (this=0xb56700, req=..., rsp=...) at CNetCMD.cpp:346
#8  0x00000000004d832e in boost::_mfi::mf2<void, CNetCMDImpl, PReqtInfo&, PRspnInfo&>::operator() (this=0x1b57458, p=0xb56700, a1=..., 
    a2=...) at /usr/include/boost/bind/mem_fn_template.hpp:280
#9  0x00000000004d7880 in boost::_bi::list3<boost::_bi::value<CNetCMDImpl*>, boost::arg<1>, boost::arg<2> >::operator()<boost::_mfi::mf2<void, CNetCMDImpl, PReqtInfo&, PRspnInfo&>, boost::_bi::list2<boost::shared_ptr<CReqtInfo>&, boost::shared_ptr<CRspnInfo>&> > (
    this=0x1b57468, f=..., a=...) at /usr/include/boost/bind/bind.hpp:392
#10 0x00000000004d7264 in boost::_bi::bind_t<void, boost::_mfi::mf2<void, CNetCMDImpl, PReqtInfo&, PRspnInfo&>, boost::_bi::list3<boost::_bi::value<CNetCMDImpl*>, boost::arg<1>, boost::arg<2> > >::operator()<boost::shared_ptr<CReqtInfo>, boost::shared_ptr<CRspnInfo> > (
    this=0x1b57458, a1=..., a2=...) at /usr/include/boost/bind/bind_template.hpp:61
#11 0x00000000004d6e58 in boost::detail::function::void_function_obj_invoker2<boost::_bi::bind_t<void, boost::_mfi::mf2<void, CNetCMDImpl, PReqtInfo&, PRspnInfo&>, boost::_bi::list3<boost::_bi::value<CNetCMDImpl*>, boost::arg<1>, boost::arg<2> > >, void, PReqtInfo&, PRspnInfo&>::invoke (function_obj_ptr=..., a0=..., a1=...) at /usr/include/boost/function/function_template.hpp:153
#12 0x00000000005ceb3e in boost::function2<void, PReqtInfo&, PRspnInfo&>::operator() (this=0x1b57450, a0=..., a1=...)
    at /usr/include/boost/function/function_template.hpp:767
---Type <return> to continue, or q <return> to quit---
#13 0x00000000005cdd95 in MutiThrHttpSvr::HttpServer (req=0x7f2c203d6ee0, arg=0x1b573e8) at HttpServer.cpp:642
#14 0x00000000006c7ed5 in evhttp_handle_request (req=0x7f2c203d6ee0, arg=<value optimized out>) at http.c:3036
#15 0x00000000006c70f7 in evhttp_read_body (evcon=0x7f2c2006d6e0, req=0x7f2c203d6ee0) at http.c:1028
#16 0x00000000006c8505 in bufferevent_readcb (fd=<value optimized out>, event=<value optimized out>, arg=0x7f2c20048690)
    at bufferevent_sock.c:186
#17 0x00000000006b3340 in event_process_active_single_queue (base=0x733ebf0, flags=0) at event.c:1350
#18 event_process_active (base=0x733ebf0, flags=0) at event.c:1420
#19 event_base_loop (base=0x733ebf0, flags=0) at event.c:1621
#20 0x00000000005cd933 in MutiThrHttpSvr::EventDispatch (arg=0x733ebf0) at HttpServer.cpp:589
#21 0x000000368a407aa1 in start_thread () from /lib64/libpthread.so.0
#22 0x000000368a0e893d in clone () from /lib64/libc.so.6

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

凝望流年 2022-09-11 05:52:31

你上来就弄多线程,Socket,IO这些是比较困难的,尤其是基础薄弱。别说你了,就算有其他编程基础的程序员,来底层弄C C++也有点困难。

非要说如何去学习,说实话,我也不知道,也许基础依旧是最重要的。计算机专业主要是学习算法、数据结构、网络基础、操作系统基础、甚至是编译原理、微机汇编这些。这些东西对于你理解很多事情帮助是很大的。也不是说非要去学习这些,但是既然你是做C C++,那么没办法,都得懂,讨巧是不行的,没有捷径。除非你去做高层次的业务开发,基于各种框架可以轻松很多。

我个人建议不要去先学C++,因为C++更难。C相对来说纯粹很多,虽然C不适合开发大型的项目,但是对于你理解事物的本质是很重要的。

学习方法,还是不断的编程编程再编程。我确实不是很赞成先看那些枯燥复杂的底层书(算法数据结构不是底层书),应该边写代码,遇到问题,边查书,再来写代码,这个循环。

  • 前期是练习数据结构和算法,让你建立编程思维方式的最佳方式。这个阶段可以在windows下做,依靠IDE可以一定程度上降低学习门槛。

  • 然后开始尝试开发一些应用小程序,这样的程序往往会开始使用系统级别的api调用,可以按照这个顺序来:文件读写、网络客户端程序、进程通信控制、多线程程序。这个阶段你需要在windows和unix两个平台做出选择。我的建议是选择unix或者linux,这个阶段边练边看大神们给你推荐的书,慢慢消化。程序不需要做界面,那都是浪费时间。

  • 有兴趣一定要去学点汇编,你就真的懂计算机是如何工作的了。你写的每一行C代码是如何映射成指令的。

  • 开始看一些开源的程序,看人家是怎么写的,看不懂的代码就查书,查网络。

然后转战C++,就差不多了。

  1. 程序在内存中是如何分配的,具体哪些在所谓的栈上,哪些在堆上

    这个看c/c++书关于内存管理的章节就知道。
  2. 从bt跟踪出来的那些错误信息,从下往上看,分别代表的是什么东西

    这个要看Call stack 和 stacktrace
    https://en.wikipedia.org/wiki/Call_stack
    https://en.wikipedia.org/wiki/Stack_trace
  3. 但我应该一开始从哪里追踪?应该是第#1处吗?

    这个就是从楼上学习过程累积的debugging技巧了。
    
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文