草庐IT

c++ - 为什么标准允许我在没有析构函数的情况下自由存储分配类?

如果你有一个没有析构函数的类:structA{~A()=delete;};标准不允许我“本地”分配那个类的实例:intmain(){Aa;//error}但如果我在免费商店上分配它似乎没问题:intmain(){a*p=newA();}只要我不对该指针调用delete:intmain(){a*p=newA();deletep;//error}所以我的问题是,如果我在自由存储上分配它,为什么标准允许我有一个没有析构函数的类?我想这有一些用例吗?但究竟是什么? 最佳答案 Somyquestionis,whydoesthestandard

c++ - 空析构函数做什么?

我听说空析构函数什么都不做,调用它也不会删除对象。但是在代码中:#include#includeclassa{public:~a(){}std::setmyset;};intmain(){aobject;object.myset.insert(55);object.~a();object.myset.insert(20);std::cout我得到:“*glibcdetected*/.app:doublefreeorcorruption(fasttop):”然后“ABORT”。如果重要的话,我启用了c++11标志。那么空构造函数实际上做了什么?它做了一些事情,但我读到它没有。

c++ - 在 C++ 中调用临时对象的析构函数的顺序是什么?

考虑以下代码:#includestructA{~A(){std::cout使用GCC编译并运行给出以下输出:~C~A~B是否保证在用其他编译器编译时,A、B、C类型的临时对象的析构函数会按此顺序调用?一般来说,如果有的话,析构函数调用临时对象的顺序是什么? 最佳答案 让我们谈谈子表达式及其顺序。如果E1排序在E2之前,这意味着E1必须在E2之前进行全面评估是。如果E1未排序E2,这意味着E1和E2可以按任何顺序进行评估。对于f(A()),在您的情况下与f(A()).operator相同,我们知道:A()在f(...)之前排序,f(.

c++ - 为什么匿名 union 不能包含具有非平凡构造函数/析构函数的成员?

我可能弄错了,但我发现的基本解释是union无法初始化,因为它不知道要调用哪个成员的构造函数。编译器无法自动为union生成构造函数。为什么不允许用户定义union构造函数?这将消除上述问题并允许存在具有非平凡构造函数/析构函数的union成员。此外,为什么union成员不能有任何自定义构造函数?前面的解释并不代表自定义构造函数。更新1:例子:structSQuaternion{union{S3DVectorAxis;struct{floatX;floatY;floatZ;};};floatW;};注意:这里的问题似乎是union是匿名的。因此,如何命名union的构造函数?这样做似乎

c++ - 堆栈上的构造函数/析构函数调用顺序

我有以下简单代码:classA{inta;public:A(inta):a(a){cout输出是:Constructora=1Printa=1Constructora=2Destructora=2Printa=2Destructora=2我发现a=2有两个析构函数调用,a=1没有一个析构函数调用,而每种情况都有一个构造函数调用。那么在这种情况下如何调用构造函数和析构函数呢? 最佳答案 a=A(2);将使用默认的operator=为a赋新值,将其a::a成员值设置为2。voidf(){Aa(1);//acreatedwithintco

c++ - 为什么在创建数组期间在 C++ 中抛出未捕获的异常时不调用析构函数?

classXX{public:staticunsigneds_cnt;XX(){++s_cnt;std::cout2)throwstd::exception();}//private:~XX(){std::cout输出:CXX1CXX2CXX3~XX~XXExc但是当我删除try-catch时,我看到:CXX1CXX2CXX3terminatecalledafterthrowinganinstanceof'std::exception'what():std::exceptionzsh:abort./a.out为什么C++在第一种情况下调用析构函数而在第二种情况下不调用?

c++ - STL map<char*,char*> 析构函数

我知道映射析构函数调用每个包含元素的析构函数。会发生什么map?我看不到这段代码在/usr/include/c++/4.4中的什么地方编辑:我应该说map喜欢http://www.sgi.com/tech/stl/Map.html 最佳答案 当map被摧毁,它包含的所有元素也被摧毁。如果元素是类类型,则调用每个元素的析构函数。但是,请牢记上面map中包含的内容。正如您所料,它不是字符串——它只是指向字符串的指针。琴弦本身并没有被破坏。只有指针是。delete永远不会在指针上调用。恰当的例子:mapstrings;char*key=n

c++ - 为什么析构函数被调用两次?

我有以下代码:#include#includeusingnamespacestd;classA{inta,b;public:A():A(5,7){}A(inti,intj){a=i;b=j;}Aoperator+(intx){Atemp;temp.a=a+x;temp.b=b+x;returntemp;}~A(){cout它显示的输出:607060701020代码几乎按预期工作。问题是它打印对象a2的值两次......这意味着析构函数被调用了两次......但为什么它被调用了两次? 最佳答案 在赋值a2=a1+50时,分配了一个包含

c++ - 如何声明模板类的析构函数

尝试编译以下类时出现错误Stack.cpp:28:错误:在‘::’标记之前需要构造函数、析构函数或类型转换#includeusingnamespacestd;templateclassStack{public:Stack():head(NULL){};~Stack();voidpush(T*);T*pop();protected:classElement{public:Element(Element*next_,T*data_):next(next_),data(data_){}Element*getNext()const{returnnext;}T*value()const{retu

析构函数中的c++异常

从其他线程,我知道我们不应该在析构函数中抛出异常!但是对于下面的例子,它确实有效。这是否意味着我们只能在一个实例的析构函数中抛出异常?我们应该如何理解这个代码示例!#includeusingnamespacestd;classA{public:~A(){try{printf("exceptioninAstart\n");throw30;printf("exceptioninAend\n");}catch(inte){printf("catchinA%d\n",e);}}};classB{public:~B(){printf("exceptioninBstart\n");throw20;