在从事C++项目三年后,可执行文件已增长到4MB。我想看看所有这些空间的去向。有没有工具可以报告最大的太空pig是什么?很高兴看到按类(类中的所有函数)、按模板(所有实例化)和按库(有多少属于C标准库和STL?exe中的每个库有多少?)编辑:注意,我在Windows上使用VisualC++。 最佳答案 在Linux中,您可以使用nm显示可执行文件中的所有符号并按大小倒序排序:$nm-CSr--size-sort选项:-C对C++名称进行解码。-S显示符号的大小。--size-sort按大小对符号进行排序。-r反转排序。如果你想获得每
我有一个对象,我想将其“转换”为另一个对象。为此,我在第一个对象上使用了placementnew,它在自己的地址之上创建了另一个类型的新对象。考虑以下代码:#include#includeclassAnimal{public:virtualvoidvoice()=0;virtualvoidtransform(void*animal)=0;virtual~Animal()=default;;};classCat:publicAnimal{public:std::stringname="CAT";voidvoice()override{std::cout您可以看到,当使用transform
在32位系统上。std::vector::max_size()返回232-1,大小为char—1个字节std::vector::max_size()返回230-1,大小为int—4字节std::vector::max_size()返回229-1,大小为double—8字节谁能告诉我max_size()取决于什么?max_size()的返回值是多少?如果它在64位系统上运行。 最佳答案 max_size()是理论上可以放入vector中的最大项目数。在32位系统上,理论上您可以分配4Gb==2^32,即2^32char值、2^30in
现在我正在谈论程序员使用typedef关键字定义的新类型。只要我的学生习惯了size_t类型(例如通过使用函数length()),我不得不让他们稍微努力“相信”它是一个整数类型,我认为它会很棒向他们展示这种类型的定义位置。所以,我在Ubuntu机器中的/usr/include中做了很多grep,我看到size_t是size_type的重新定义,而size_type又是metadata_type的重新定义,这就是在这个目录下结束。没有找到最终的“typedefunsignedintmetadata_type;”。在/usr/src中,我发现了另一个名为yy_size_t的先前类型,...
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:WhenyouexitaCapplication,isthemalloc-edmemoryautomaticallyfreed?当我阅读有关在C/C++中的动态内存分配方面分别使用delete/free的强制性时,我想到了这个问题。我想如果内存分配在我的程序执行终止之后仍然存在,那么是的,它是强制性的;否则,我为什么要担心释放分配的空间?操作系统不会在进程终止时自动释放它吗?我有多正确?我的问题是可以int*ip=newint(8);在我的程序终止后仍然存在? 最佳答案
我这样做:MyClassmyObject=*newMyClass();但是很多人说我应该这样做:MyClass*myObject=newMyClass();是否存在性能差异。还是完全使用第二种方法的合乎逻辑的理由?我只是更喜欢使用第一种方法来摆脱指针混淆。 最佳答案 两者都不一样!首先给您一个未定义的行为[Ref1:]或内存泄漏,而如果您稍后调用delete,第二个则不会。MyClassmyObject=*newMyClass();在freestore上分配一个MyClass类型的对象,然后将该对象复制到myObject。您丢失了指
如果我声明一个临时自动删除的字符缓冲区使用std::auto_ptrbuffer(newchar[n]);然后当缓冲区超出范围时,缓冲区会被自动删除。我会假设缓冲区是使用delete删除的。但是缓冲区是使用new[]创建的,所以严格来说应该使用delete[]删除缓冲区。这种不匹配可能导致内存泄漏的可能性有多大? 最佳答案 对用new[]分配的指针调用delete的行为是undefined.如您所料,auto_ptrdoescalldelete当智能指针超出范围时。您需要担心的不仅仅是内存泄漏——崩溃和其他奇怪的行为也是可能的。如果
考虑以下示例代码:#include#includeusingnamespacestd;intf(uint32_ti){return1;}intf(uint64_ti){return2;}intmain(){cout这在MacOSX上失败:$g++--versioni686-apple-darwin10-g++-4.2.1(GCC)4.2.1(AppleInc.build5664)$maketestg++test.cc-otesttest.cc:Infunction'intmain()':test.cc:23:error:callofoverloaded'f(size_t&)'isamb
有没有办法使用new关键字在堆栈上分配(alaalloca)而不是堆上(malloc)?我知道我可以自己破解,但我不想这样做。 最佳答案 要在堆栈上分配,要么将你的对象声明为局部变量按值,或者你可以实际使用alloca获取指针,然后使用就地new运算符:void*p=alloca(sizeof(Whatever));new(p)Whatever(constructorArguments);但是,虽然使用alloca和in-placenew可确保在返回时释放内存,但您放弃了自动析构函数调用。如果您只是想确保在退出范围时释放内存,请考虑
我需要一种简单的方法来获取T类对象的计数/长度/大小在哪里T是某种集合类型,例如std::map,std::list,std::vector,CStringArray,CString,std::string,……对于大多数标准类型,T::size()是正确答案,对于大多数MFC类T::GetSize()是正确的,对于CString,是T::GetLength().我想点个赞:templateautosize(constT&t)...计算出正确的成员函数调用。似乎应该有一种简单的方法来调用T上的特征模板其中有一个size(constT&t)成员,它本身使用SFINAE存在或不存在,如果存