问题标签 [explicit-destructor-call]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2016 浏览

c++ - 伪析构函数调用不会破坏对象

考虑以下代码:

我预计这a将被摧毁。但事实并非如此,为什么呢?那个伪析构函数调用将如何销毁对象?

0 投票
1 回答
561 浏览

c++ - 析构函数调用后访问成员变量

我有这样的代码:

显式调用析构函数后,我Test类的所有成员变量可能都无法访问,因此调用foo.blub()无效。如果我将引用存储在局部变量中以避免访问成员变量,那么调用是否可以foo.blub()保证工作?编译器不能在析构函数调用后优化局部变量并访问成员变量,使其再次无效吗?

0 投票
3 回答
3373 浏览

c++ - 在对象被显式销毁但在其内存被释放之前调用成员函数是否合法?

我有这个代码:

请注意,doNothing()在对象被销毁之后但在其内存被释放之前调用它。看起来“对象生命周期”已经结束,但是指针仍然指向正确分配的内存。成员函数不访问任何成员变量。

在这种情况下,成员函数调用是否合法?

0 投票
1 回答
126 浏览

c++ - C++ 意外的析构函数调用

我有一个关于 C++ 中数据结构的作业,但我遇到了一个奇怪的问题。抱歉,如果标题有点不合时宜。首先,作为家庭作业,我们给出了一个 PaperRepository 类的头文件来实现。该类通过循环双向链表保存论文信息。每篇论文都有标题、发表论文的期刊、发表年份和由另一个链表类(排序链表)持有的共同作者列表,这是 PaperRepository.h 文件

为了保存论文,我实现了一个循环双向链表类(正如我的导师所说)。这是 CDoublyLinkedList.cpp

这是 LinkedList.cpp。由于我没有在列表中添加或删除任何共同作者,因此我不会在此处编写添加和删除方法。链表.cpp

而我对 PaperRepository 类的 add 方法的实现在这里: PaperRepository.cpp

我没有添加其他方法,因为我的问题从添加方法开始。最后,还有我的 Paper 和 CoAuthor 类的重要部分。纸.cpp

和 CoAuthor.cpp

这是我目前正在测试的文件。主文件

当我运行程序时,我看到在调用 CDoublyLinkedList.cpp 文件的 add 方法中的命令并执行“Node newNode = new Node(data)”时,调用了 LinkedList 类的析构函数。这对我来说很奇怪。此外,LinkedList 类的析构函数总共被调用了 5 次。我正在向循环双向链表类添加数据,它调用另一个链表类的析构函数。对不起,这有点长,但我无法解释自己。这是此 main.cpp 文件的输出:

0 投票
1 回答
191 浏览

c++ - 对标量类型和未定义行为的析构函数调用

我刚刚编写了以下程序,它可以编译并运行良好。(在这里查看现场演示

为什么程序编译得很好?如果我没记错的话,标量类型在 C++ 中没有构造函数和析构函数。那么,这个程序定义好了吗?在这种情况下显式调用析构函数会破坏variable a还是在函数执行完成时编译器会自动破坏?我知道在对象的生命周期结束后访问对象在 C++ 中具有未定义的行为。但是 C++ 标准对此有何评论?

我在这里发现了一些类似的问题。@Columbo 给出的答案是:

您不能为标量类型调用析构函数,因为它们没有析构函数。该语句仅适用于模板代码,您在其中调用您不知道其类型的对象的析构函数 - 它消除了为标量(甚至数组)类型编写专门化的必要性。

所以,我不明白他给出的解释。如果有人使用模板代码解释它会更好,其中析构函数被称为类型未知的对象。如果有人用简单的例子解释这一点,我将不胜感激。

0 投票
2 回答
422 浏览

c++ - 逐个销毁单个 shared_ptr

我试图一个接一个地破坏一个 shared_ptr,但是当我破坏最后一个指针时, use_count() 变得疯狂。观察我的代码:

将在调试器中产生以下输出:

我希望在最终销毁时它将 use_count() 设置为 0 并为整数释放内存。似乎这一切都没有发生。

当 use_count() == 1 时,我可以 if() 声明这个,但这似乎很不雅。有谁知道另一种解决方案?

0 投票
1 回答
986 浏览

debugging - 我可以显式调用属性析构函数,以便查看是哪一个导致问题吗?

我想这是一个非常讨厌的问题 - 似乎我班级的属性析构函数之一造成了僵局。属性析构函数在类析构函数之后自动调用。而且我想手动调用它们并在每个成功后进行日志条目。

该问题仅发生在无法使用调试器的设备上,因此我改用日志。

但是上面的代码实际上会导致异常,因为~io_service()被调用了两次

那么有没有办法正确地做到这一点?如果没有,调试析构函数的替代方法是什么?

0 投票
2 回答
1113 浏览

c++ - 是否允许显式调用析构函数,然后在具有固定生命周期的变量上放置 new?

我知道显式调用析构函数可能会由于双重析构函数调用而导致未定义的行为,如下所示:

但是,如果我们称placement new 来“复活”对象呢?

更正式地说:

  1. 如果我明确地在某个对象上显式调用析构函数,而该对象最初不是用放置 new 构造的(例如它要么是局部/全局变量,要么是用new) 分配的,然后,在这个对象被破坏之前,在它上面调用placement new 来“恢复”它?
  2. 如果没问题,是否可以保证对该对象的所有非常量引用也可以,只要我在对象“死”时不使用它们?
  3. 如果是这样,是否可以使用非常量引用之一来放置 new 以复活对象?
  4. const 引用呢?

示例用例(尽管这个问题更多是关于好奇心):我想“重新分配”一个没有operator=.

我见过这个问题,它说具有非静态const成员的“覆盖”对象是非法的。因此,让我们将这个问题的范围限制在没有任何const成员的对象上。

0 投票
3 回答
3996 浏览

c++ - 为什么不能显式调用构造函数而析构函数可以?

在下面的 C++ 代码中,我可以显式调用析构函数,但不能显式调用构造函数。这是为什么?不是明确的 ctor 调用与 dtor 案例更具表现力统一性吗?

0 投票
1 回答
128 浏览

c++ - 使用模板关键字的伪析构函数调用

以下代码无法使用clang 5.0.0编译(编译标志为-std=c++14 -Wall -Wextra -Werror -pedantic-errors -O0):

template这是一种强制编译带有关键字的伪析构函数调用的方法吗?