我正在尝试为一个非常简单的C++程序中的对象动态分配(它不像现在那样动态,但最终会动态分配)内存。我是新来的类(class),最近才开始玩C++,把C抛在了后面。这是代码:#includeusingnamespacestd;classTest{private:inti;public:Test(int);~Test();voidprint();};Test::Test(intii){i=ii;}Test::~Test(){i=0;coutprint();//thisworksaswellfor(inti=0;iprint();/*thisshowsthatthevalueofi=1..s
我有一个关于字符串的问题,或者特别是关于字符串使用的内存的问题。我正在使用MSVC2010。考虑这段代码:voidTest(){LPWCSTRString=L"Testing";PrintString(String);}voidPrintString(LPWCSTRString){//printStringtoconsoleorsimilar}以这种方式创建和使用字符串是否安全?当字符串超出范围时,是否释放了为存储字符串分配的内存? 最佳答案 是的,它是安全的,但实际上没有分配;)L"Testing"将保留在您的exe文件的只读部分
我正在编写一个程序,它从.ini文件中读取一个值,然后将该值传递给一个接受PCSTR(即constchar*)的函数。函数是getaddrinfo()。所以,我想写PCSTRReadFromIni()。要返回常量字符串,我计划使用malloc()分配内存并将内存转换为常量字符串。我将能够获得从.ini文件中读取的确切字符数。这种技术可以吗?我真的不知道还能做什么。以下示例在VisualStudio2013中运行良好,并根据需要打印出“hello”。constchar*m(){char*c=(char*)malloc(6*sizeof(char));c="hello";return(co
有比我对C++标准理解更深的人可以详细说明一下吗?这是我的示例程序#include#includeintmain(intargc,char*argv[]){conststd::stringmessage("helloworld");std::cout0)?message:"";std::cout在一台机器上它这样做:#g++--version&&g++str_test.cpp&&./a.outg++(Debian4.7.2-5)4.7.2Copyright(C)2012FreeSoftwareFoundation,Inc.Thisisfreesoftware;seethesourcef
我最近一直在尝试了解C++分配器的工作原理,并且一直在寻找STL库用于类似std::set之类的红黑树的实现。或std::map,但有些事情我无法理解。首先要做的是从容器必须存储的类型转换分配器-_Val-树使用的节点类型-_Rb_tree_node-使用重新绑定(bind)模板:typedeftypename__gnu_cxx::__alloc_traits::templaterebind>::other_Node_allocator;typedef__gnu_cxx::__alloc_traits_Alloc_traits;这个我可以解决。现在,当一个元素被插入并且它需要创建一个新
我正在重构一些旧代码。有一个C风格的函数是这样工作的:(显然我在这里简化了它)intLoadData(char**buf1,int*buf1Len,char**buf2,int*buf2Len){*buf1Len=DetermineLength1();*buf1=(char*)malloc(*buf1Len);//Fillbuf1*buf2Len=DetermineLength2();*buf2=(char*)malloc(*buf2Len);//Fillbuf2intresult=0;//OrsomeotherINTdependingofresultreturnresult;}现在,
我创建了一个类,其中包含3个相同类型的元素(类似std::pair>)。而且我准备使用for(auto&var:t)但我不知道我这样做是否安全。templateclassTroika{public:Troika(constT&f,constT&s,constT&t):first(f),second(s),third(t){}Troika(){}Tfirst;Tsecond;Tthird;typedefT*iterator;typedefconstT*const_iterator;iteratorbegin(){return&first;}const_iteratorbegin()con
有时我会在各种C++程序中看到对象的声明和使用方式如下:object*obj=newobject;obj->action();obj->moreAction();//etc...这样做有什么好处,而不是简单地做:objectobj;obj.action();obj.moreAction();//etc 最佳答案 是的-您可以将指针存储在容器中或从函数中返回它,并且当指针超出范围时对象不会被销毁。使用指针避免不必要的对象复制,促进可选对象的创建,用于自定义对象生命周期管理,用于创建复杂的图形结构,对于上述的组合。这不是免费的——当你不
所以,我在C++书中看到的基本文本输入函数的上下文中问这个问题:char*getString(){chartemp[80];cin>>temp;char*pn=newchar[strlen(temp+1)];strcpy(pn,temp);returnpn;}因此temp声明了一个包含80个字符的数组,这是一个自动变量,一旦getString()返回,其内存将被释放。有人建议,如果您出于某种原因返回temp,它在函数外部的使用将不可靠,因为一旦函数完成,该内存就会被释放。但是由于我也在相同的上下文中声明了pn,为什么它的内存没有被丢弃呢? 最佳答案
我正在搞乱一些进程间通信的东西,我很好奇是否可以将一个函数复制到一些共享内存中并从任何一个进程从那里运行它。类似于:memcpy(shared_memory_address,&func,&func+sizeof(func));我知道你不能接受函数的大小,但我突然想到了这一点。 最佳答案 那很有趣。但看起来你可以。虽然我永远不会这样做:在运行Windows7的lenovo:T61p上编译:使用g++4.3.4我会注意到某些类型的硬件会阻止这种情况,因为您只能从硬件内存映射文件中标记为只读的特定内存区域(程序区域)执行代码(以防止自修改