考虑以下代码:classA{public:A(){}~A(){}};classB:publicA{B(){}~B(){}};A*b=newB;deleteb;//undefinedbehaviour我的理解是,C++标准规定删除b是未定义的行为-即,任何事情都可能发生。但是,在现实世界中,我的经验是~A()总是被调用,并且内存被正确释放。如果B引入任何具有自己的析构函数的类成员,它们将不会被调用,但我只对上面的简单情况感兴趣,其中使用继承可能会修复一个类方法中的错误源代码不可用。显然,这不会是您在非平凡情况下想要的,但它至少是一致的。对于显示的代码,您是否知道任何C++实现都不会发生上
这是我的C++代码:classSample{public:int*ptr;Sample(inti){ptr=newint(i);}~Sample(){deleteptr;}voidPrintVal(){cout它返回如下输出:SayiaminsomeFuncNullpointerassignment(Run-timeerror)这里当对象按值传递给SomeFunc时,当控件从函数返回时调用对象的析构函数我应该对吗?如果是那么为什么会这样?什么是解决方案??? 最佳答案 Sample按值传递给SomeFunc,这意味着制作了一个拷贝。
我想知道何时为C++03和C++11调用临时数组的析构函数假设我有以下情况foomethod(){foof;............returnfoo;}voiddoSomething(){foof=method();....}假设我正在使用标志-fno-elide-constructors因为我想从理论上了解何时调用临时的析构函数。因此,在C++03中的上述代码中,当method()完成时,使用其复制构造函数制作了foo的拷贝。之后在语句foof=method()中再次调用foo的复制构造函数。在这种情况下,对于C++03,何时调用此临时对象(由method传递)的析构函数?是否在范
这个问题在这里已经有了答案:WhatisTheRuleofThree?(8个答案)关闭7年前。我的C++程序中的析构函数有问题。当我运行程序并获取用户输入时,它突然调用析构函数,然后cout甚至无法在语句中打印。假设用户输入将是一个,因为我将这部分代码设计为仅接受输入1。我认为当您离开范围时会调用析构函数,所以我认为至少应该在cout之后调用析构函数我将在下面评论的if语句,以使你们更容易阅读。如果有人可以解释我的错误并纠正它,那就太好了!在我的头文件中有#include#include#include#includeusingnamespacestd;classcreature{pu
您好,我在类(class)Ordinateur中有一个*Composantvector:classOrdinateur{stringtype;vectorComposants;...}我该如何编写我的析构函数?我在StackOverflow上阅读了很多相互矛盾的答案,所以我有点迷茫。第一个版本:virtual~Ordinateur(){for(inti=0;i第二版virtual~Ordinateur(){Composants.clear();}关于:virtual~Ordinateur(){for(inti=0;i我想避免内存泄漏...... 最佳答案
考虑以下代码:structA{virtualvoidfoo(){}virtual~A()=0;};structB:publicA{virtualvoidfoo(){};};A::~A(){};intmain(){A*a=newB();a->foo();}它工作得很好。但现在考虑第二个代码,我们需要在一个函数内本地声明我们的类:voidfoo(){structA{virtualvoidfoo(){}virtual~A()=0;};structB:publicA{virtualvoidfoo(){};};A::~A(){};//errorC2352:'A::~A':illegalcallo
我有一个类(A),它在其构造函数和析构函数中访问(通过静态方法间接访问)另一个类(B)中的静态变量(STL容器)。对象可以是全局的、全局常量、另一个类的静态成员、存储在其他类中(它们本身可能具有全局或静态实例)或者基本上是C++对象可以存在的任何其他地方。如果一个A对象在B中的静态成员之前构造或在B中的静态成员之后析构,它会在某个时刻导致崩溃(通常是访问冲突)。有什么方法可以保证类A的所有实例(除了那些已经泄漏的实例,因为根据定义在那里“丢失”并且不会以任何方式被销毁)在B的静态变量之后构造并在B的静态变量之前销毁?我见过一些使特定变量在另一个变量之前/之后构造/销毁的解决方案,但不是
如果我有一个包含指向另一个类Vehicle的指针数组的类:classList{public://stuffgoeshereprivate:Vehicle**vehicles;}如果我现在编写List类的析构函数,我是否手动遍历数组(我知道数组中有多少项)并删除每个指针到车辆,还是C++会自动调用数组中所有车辆的析构函数?(如果类中有一个私有(private)字符串/...,或者如果它是Vehicle指针的STL容器,就像它所做的那样)编辑:我忘记了delete[]vehicles,但如果我这样做,它会同时删除数组中所有车辆使用的内存,还是只删除指针使用的内存?
以下代码为g++版本4.6.2提供了一个异常(exception),但在g++版本4.2.1中按预期运行。执行期间打印的消息表明,在这两种情况下,都会在从未构造过的地址上调用析构函数。我想知道(a)哪个编译器是正确的,(b)为什么有些东西没有被创造就被破坏了。非常感谢。//------------------------------------------------------#includeusingnamespacestd;classPoly{private:float*coeff;public:Poly(){coeff=NULL;cout对于g++4.6.2,它给出了异常:%.
我正在尝试以下示例:classbase//baseclass{public:std::listvalues;base(){}voidinitialize(base*b){values.push_front(b);}virtual~base(){values.clear();coutinitialize(static_cast(d));/*fillinglist*/deleteb;return0;}Q.1)为什么派生类的析构函数没有被调用,因为在基类析构函数中我正在执行values.clear()?Q.2)如果基类析构函数是虚拟的,是否需要派生类析构函数定义?