我在同行代码审查session期间看到了如下代码:char*s=newchar[3];*s++='a';*s++='b';*s++='\0';delete[]s;//thismayormaynotcrashonsomeoranyday!!首先,我知道在标准C++中,指向数组大小的后一位是可以的。尽管访问它会导致未定义的行为。所以我相信最后一行*s++='\0'没问题。但如果我没记错的话,C++标准要求delete应该提供与new返回的指针相同的指针。我相信这意味着返回的指针不能被篡改。我猜这是因为new可能会在delete可能使用的返回地址之前保留一些内务管理信息。移动new的指针可能
最初的问题与重载operator=有关,我想分享我的发现,因为找到它们对我来说很重要。我无法想象将(a=b)用作左值的合理示例。在IRC和谷歌的帮助下,我找到了下一篇文章:http://msdn.microsoft.com/en-us/magazine/cc301415.aspx它提供了两个示例。(a=b)=cf(T&);f(a=b)但两者都不太好,我认为这是不好的做法。第二个给我同样的感觉。您能否提供更多好的示例,说明为什么它应该是非常量? 最佳答案 一个很好的理由是标准中要求类X在标准容器中可用的要求之一是表达式a=b必须具有类
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。删除数组只用一个关键字很难吗?效率低吗?
删除运算符是如何工作的?它比free()更好吗?此外,如果您执行ptr=newchar[10],然后使用deleteptr删除,指针如何知道要删除多少个位置。 最佳答案 只有delete操作符,free只作为函数存在。在C++下,我们鼓励您使用new/delete而不是malloc()/free()。删除运算符有一个内部的“魔法”。当使用new[]创建数组时,数组的大小存储在内存块的元数据中。delete[]使用该信息。所有这些当然都依赖于编译器、操作系统、优化器和实现。 关于c++-C
我正在用C++编写一个日志类。这个类是一个单例。我想以这种方式添加日志:Log::GetInstance()好的,在一个Log对象中,我想在最后一个参数出现时保存整行(本例中为“在类foo”中)。如何检测最后一个我不使用任何结束标签。 最佳答案 你可以通过不使用单例来解决这个问题。如果您创建这样的函数:Loglog(){returnLog();}您几乎可以像以前一样添加日志:log()不同之处在于Log对象的析构函数在此行之后被调用。所以现在您有办法检测最后一个参数何时被处理。 关于c+
我遇到了一个我无法解决的问题。我的问题是,如果我使用malloc分配内存,然后使用delete删除内存块?一般的经验法则是Ifweallocatememoryusingmalloc,itshouldbedeletedusingfree.Ifweallocatememoryusingnew,itshouldbedeletedusingdelete.现在,为了检查如果我们反过来会发生什么,我写了一个小代码。#include#include#includeusingnamespacestd;classA{intp=10;public:intlol(){returnp;}};intmain()
#defineSAFE_DELETE(a)if((a)!=NULL)delete(a);(a)=NULL;或templatevoidsafe_delete(T*&a){deletea;a=NULL;}或者其他更好的方式 最佳答案 我不会说两者都不是,因为两者都会给您一种虚假的安全感。例如,假设您有一个函数:voidFunc(SomePtr*p){//stuffSafeDelete(p);}您将p设置为NULL,但函数外的p拷贝不受影响。但是,如果您必须这样做,请使用模板-宏总是有可能影响其他名称。
我有一些代码使用了很多指向同一个地址的指针。给出一个等效的简单示例:int*p=newint(1);int*q=p;int*r=q;deleter;r=NULL;//ok//deleteq;q=NULL;//NOTok//deletep;p=NULL;//NOTok如何在不多次删除的情况下安全地删除它?如果我有很多指针都指向同一地址的对象,这尤其困难。 最佳答案 您的工具是boost库的shared_ptr。查看文档:http://www.boost.org/doc/libs/1_44_0/libs/smart_ptr/shared
我有一个带有几个纯虚函数的抽象类,我从它派生的类之一不使用其中一个纯虚函数:classderivative:publicbase{public:intsomevariable;voidsomefunction();};无论如何,当我尝试编译它时,我得到一个错误(显然,如果从抽象类派生并且不覆盖所有纯虚函数,类仍然被认为是抽象的)。无论如何,定义一个函数似乎毫无意义intpurevirtfunc(){return0;}只是因为它需要通过技术来定义。无论如何从抽象类派生类而不使用抽象类的纯虚函数之一? 最佳答案 如果派生类不“使用”基类
我发现C++提供了默认的operatorenum的函数类型:#includeusingnamespacestd;enumOpType{Select,Insert};intmain(){OpTypet=Select;cout运行结果为:0虽然不提供默认operator>>功能:#includeusingnamespacestd;enumOpType{Select,Insert};intmain(){OpTypet=Select;cin>>t;return0;}构建它会产生以下编译错误:prog.cpp:Infunction‘intmain()’:prog.cpp:11:6:error:n