草庐IT

c++ - 基本的 C 风格字符串内存分配

我正在使用现有代码开发一个项目,该代码主要使用C++,但使用C风格的字符串。采取以下措施:#includeintmain(intargc,char*argv[]){char*myString="thisisatest";myString="thisisaveryveryveryveryveryveryveryveryveryveryverylongstring";cout这编译并运行良好,输出是长字符串。但是我不明白为什么它有效。我的理解是char*myString是一个指针,指向一个足够大的内存区域来保存字符串文字“thisisatest”。如果是这样,那么我如何才能在同一位置存储更

c++ - 这行代码是如何工作的?

所以我最近在看某人的代码,我发现编译器没有报错,也没有以下任何运行时错误:constchar*p="Ididn'tmalloc...";上面的代码有效,但我想知道如何。这就是我认为正在发生的事情。谁能证实这一点?所以“我没有malloc...”在编译时在堆栈上静态分配,地址被传递给指针p。类似于静态数组的分配方式。我对此有90%的把握,但一些确认会有所帮助。谢谢。 最佳答案 你有一个字符串文字"Ididn'tmalloc..."位于只读内存中的某处(确切地说是实现定义的位置),它由指针p指向。需要注意的重要一点是,任何更改此字符串文

c++ - 如何正确使用malloc和free memory?

我想知道使用malloc和free的正确/标准方法是什么。free后是否需要设置指针为NULL?基本上,以下两种方式中哪一种是正确的?double*myPtr=(double*)malloc(sizeof(double)*5);.....free(myPtr);或double*myPtr=(double*)malloc(sizeof(double)*5);.....free(myPtr);myPtr=NULL;或者应该是其他方式使用malloc和free?谢谢。 最佳答案 两者都很好。唯一的区别是,如果您第二次尝试释放myPtr,前

c++ - c/c++中指针的内存开销

我在64位平台上,所以所有内存地址都是8个字节。因此,为了估计一个数组的内存使用情况,我应该为数组中的每个条目向sizeof(DATATYPE)添加8个字节。例子:shortunsignedint*ary=newshortunsignedint[1000000];//length1mio//sizeof(shortunsingedint)=2bytes//sizeof(shortunsingedint*)=8bytes那么每个条目占用10bytes吗?因此,我的1mio长度数组会使用至少10兆字节吗?谢谢 最佳答案 不,您不会获得每

c++ - 将指向堆栈变量的指针传递给 realloc() 是否有效?

intmain(){charmyString=NULL;realloc(&myString,5);strncpy((char*)&myString,"test",5);}似乎工作正常,但我仍然对堆栈和堆有点困惑。这是允许的吗?如果允许的话,myString是需要手动释放还是超出作用域就释放?编辑:感谢您的回复,所以我认为这同样是非法的//IwantthecodetochangemyStringto"tests"charmyString[5]="test";realloc(&myString,strlen(myString)+2);myString[4]='s';myString[5]=

c++ - 在 C++ 中,有任何处理内存分配/删除的一般准则吗?

可能我所要求的只是指向我尚未找到的网站的链接。但是来自Java背景,在C++中处理内存分配和删除的一般准则是什么?我觉得我可能会在我的应用程序中添加各种内存泄漏。我知道智能指针有多种变体,您也可以向我提及它们,但我想关注标准C++指针。 最佳答案 我一贯的方针是这样的在用法非常复杂的地方使用智能指针。所有原始指针都属于负责删除它的特定对象。如果以后要设置指针,构造函数总是分配指针或将其初始化为null。析构函数总是删除所有包含的指针这些规则确保指针在其拥有的对象被删除时被删除,从而消除了最常见的内存泄漏情况。永远不要将内部指针传递给

c++ - 将项目推送到 STL 容器后出现段错误

typedefstructtemp{inta,b;char*c;temp(){c=(char*)malloc(10);};~temp(){free(c);};}temp;intmain(){tempa;listl1;l1.push_back(a);l1.clear();return0;}给出段错误。 最佳答案 你没有复制构造函数。当您将“a”插入列表时,它会被复制。因为你没有复制构造函数(为c分配内存并从旧c复制到新c)c是a中的相同指针和列表中a的拷贝。两个a的析构函数都被调用,第一个会成功,第二个会失败,因为c指向的内存已经被释

C++ 动态内存细节

我是一名C和Java程序员,因此内存分配和OOP对我来说并不是什么新鲜事。但是,我不确定如何通过对象的C++实现来避免内存泄漏。即:strings1("0123456789");strings2=s1.substr(0,3);s2现在有一个新的字符串对象,因此必须通过以下方式释放它:delete&s2;对吧?此外,我是否正确地假设我必须删除函数返回的任何(新)对象的地址,而不管返回类型不是指针或引用?堆上的对象在必须被释放时不会作为指针返回,这看起来很奇怪。 最佳答案 没有。您只需要释放您分配的内存(即通过new或memalloc)

c++ - Memory SPIKE - boost ASIO 异步读取

写了一个只从客户端读取数据的服务器:使用boost::array缓冲区启动服务器,系统监视器显示1MB的使用量。1.)只需执行一个async_read_some并执行一个handleRead,我会在其中再次调用asyncRead函数。voidasyncRead(){m_socket->async_read_some(boost::asio::buffer(m_readBuffer,READ_BLOCK_SIZE),m_strand->wrap(boost::bind(&ConnectionHandler::handleRead,shared_from_this(),boost::asi

c++ - 使用 > 2GB 内存时,Cygwin g++ x86_64 段错误(核心已转储)

我用C++编写了一个素数筛选程序,它使用~12GB内存来计算低于100,000,000,000(1000亿)的所有素数。该程序在使用VisualStudio2012(在为x64设置的项目中)以及64位Linux上的g++编译时运行良好。但是,当在Windows7HomePremium64位上使用cygwin64中的g++编译时,当尝试使用超过~2GBram(运行筛子>~17,000,000,000)时会发生段错误我相当确定它作为64位进程运行,因为任务管理器中的进程名称旁边没有*32。代码:#include#include#include#includeusingnamespacest