gpt4 book ai didi

c++ - 在作用域生存期之前调用C++析构函数

转载 作者:行者123 更新时间:2023-12-01 15:12:29 25 4
gpt4 key购买 nike

我有一个关于过早触发对象的析构函数的问题。我有一个动态分配的指针数组,该指针指向动态分配的Word对象。数组的名称为words_。 words_是另一个称为Dictionary的类的类属性。
在我的Dictionary类中,我有一个函数,可以在其中访问每个Word对象并调用Word类的成员函数。
下面的代码过早地触发了析构函数:

Word *curr_word_ptr = words_[idx]; // This line is okay, doesn't trigger destructor
Word curr_word = *curr_word_ptr; // This line triggers the destructor prematurely
curr_word.callMemberFunc();
由于第二行,函数作用域一结束,就调用析构函数。
但是,如果我仅通过数组索引访问它:
*(words_[idx]).callMemberFunc(); // The desctructor is not called prematurely
这是因为我有一个堆栈变量(甚至没有堆栈指针变量)访问动态分配的对象吗?这样,当函数的作用域结束时,堆栈变量(curr_word)和动态分配的堆栈对象都被破坏了吗?
谢谢。

最佳答案

Word curr_word = *curr_word_ptr;定义了一个本地Word,它仅存在于您的函数的本地范围内。当函数退出时,它将被销毁。请注意,它是被破坏的初始Word的副本,而不是原始副本。
如果您希望使用方便的语法,而不必完全取消引用或进行复制,请使用引用:

Word &word = *curr_word_ptr;
这是C++提供的语法糖,用于引用没有指针的对象(直接)。但是请注意,在这种情况下,对 word所做的任何更改也会影响您的原始单词。
如果您的 Word包含动态分配的内存,则问题会更加严重。假设您使用默认的复制构造函数,则将复制地址。这样,销毁本地 Word将释放仍由原始 Word引用的内存,从而在下次访问时导致崩溃。

关于c++ - 在作用域生存期之前调用C++析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63110068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com