当前位置: 首页 > 知识库问答 >
问题:

析构函数调用的次数超过了它应该调用的次数。MSVC中是否有Bug?

谢鸿羲
2023-03-14
#include <iostream>

using namespace std;

struct B {
    B() { cout << "B"; }
    //B(const B& b) { cout << "copyB"; }
    ~B() { cout << "~B"; }
};

struct C : B {

};

void f(B b) {

}

int main() {
    C c;
    f(c);
    return 0;
}

仅在MSVC中。Clang和GCC输出b~b~b(这很可能是正确的)。

有趣的是:如果取消copy-ctor注释,它将输出bcopyb~b~b,这是正确的(析构函数调用了两次)。

是MSVC编译器中的bug吗?还是正确的行为?

共有1个答案

郭元凯
2023-03-14

如果打印地址:

#include <stdio.h>

struct B {
    B() {  printf(" B() <%p>\n", (void*)this); }
    ~B() { printf("~B() <%p>\n", (void*)this); }
};

struct C : B { };

void f(B b) { }

int main() {
    C c;
    f(c);
}

输出为:

 B() <000000A013FFFAC4>
~B() <000000A013FFFAA0>
~B() <000000A013FFFBA4>
~B() <000000A013FFFAC4>

正如您所看到的,没有对象被破坏2次。似乎有一个临时的参与,据我所知,这是不允许的。这让我相信这是一个bug。只有当复制构造函数很琐碎时,才会发生这种情况。由于析构函数不是微不足道的,所以它是可观察的行为,并且不在as-if规则中涵盖。

 类似资料:
  • 我有一个帖子列表,我试图在构造函数或componentDidMount中为每个帖子调用一个操作。但不知何故,当我发送一个新消息时,构造函数和componentDidMount函数会被调用两次。 当从列表中读取帖子时,这些函数仅被调用一次。但是当我发送一条新消息时,他们会被呼叫两次。 我怎样才能避免这种情况。我试着像这样使用ComponendDupDate函数:

  • 我是新的反应,我试图用它开发一个简单的网络应用程序,但我得到了一个错误。当我加载一个类组件时,我的构造函数被调用两次,你能帮忙吗? 原木地被击中两次。在一些组件中,我希望进行一个命中DB的API调用,但我只想命中它一次。在许多情况下,使用并不方便,因为道具只出现在之后,因此我想在中调用(我不会使用setState,这会导致重新加载render)。 提前感谢

  • 假设我们有一个函数和另一个函数 我们希望编写一个Unit测试,检查是否调用了的次数和正确的参数。 那里有 但这只是指最后一次通话。所以假设调用,然后,调用的断言是。 此外,还有 这将生成一个包含正确参数的对象列表。将这个列表与我们在单元测试中创建的对象进行比较,感觉是一件非常讨厌的事情<代码>调用似乎是模拟库的一个内部类。 有更好的方法吗?我使用这个设置来测试函数的并行执行。

  • 我的react组件的构造函数被调用了两次,但我不知道为什么。我正在使用react redux存储我的应用程序的语言。我有一个基于浏览器语言设置默认语言的函数。LoginPage是第一个获得render的组件,因此我在其构造函数中调用了我的函数。基本上,它所做的就是比较并分派一个动作。当我用redux开发工具检查我的状态时,我看到它被调度了两次。我在构造函数中打印了虚拟数据,它也打印了两次。 登录页

  • 编辑:由于代码剪贴不会重现错误-这里有一个指向github repo的链接:(代码远未完成) https://github.com/altruios/clicker-game 我现在已经在两台计算机上运行了它——这两台计算机都有相同的行为,而代码剪报并没有显示出来。 因此,我正在构建一个clicker游戏来学习react,我不明白为什么这段代码会以这种方式运行: 在主应用程序中,我有以下功能: 那

  • 问题内容: 我需要创建一个只能执行一次的函数,在第一次执行后,每次都不会执行。我从C++和Java知道可以完成此工作的静态变量,但我想知道是否有更优雅的方法来做到这一点? 问题答案: 如果用“将不执行”来表示“多次调用将不执行任何操作”,则可以创建一个闭包: 使用全局变量,其他代码可以重置“已执行”标志的值(无论您为它选择什么名称)。使用闭包时,其他代码都无法做到这一点,无论是偶然还是故意的。 正