繁体   English   中英

C++ | 临时指针生命周期

[英]C++ | temporary pointers lifetime

我正在研究 C++ 并且在我所有的“实验”中,我试图了解临时对象(右值)的生命周期。

我的问题是:

拥有一个包含 const char* 指针的 object,当我想使用以“const char*”作为参数的构造函数时会发生什么? 通常临时对象会自动销毁,但是以这种方式创建的指针会发生什么?

我暂时不使用 std::string 或其他 c++11 类,因为我只专注于理解右值。

下面的一个例子:

class MyAwesomeClass {

private:
    const char* data;

public:
    MyAwesomeClass(const char* ptr) {

        this->data = ptr;
    }

    MyAwesomeClass(MyAwesomeClass&& myAwesomeClassRVALUE) {

        this->data = myAwesomeClassRVALUE.data;
        myAwesomeClassRVALUE.data = nullptr;
    }

    ~MyAwesomeClass() {

        delete data;
    }
};

int main() {

    MyAwesomeClass s = "My Awesome Class' string data.";

    return 0;
}

通常临时对象会自动销毁,但是以这种方式创建的指针会发生什么?

指针本身就是对象。 与所有其他临时对象一样,临时指针对象也会发生同样的事情。

您的示例删除了指向字符串文字的指针,因此程序的行为未定义。 class 也会有一个损坏的赋值运算符,即使它通过将指针传递给使用new[]分配的数组来正确使用。

至于右值,我能找到的示例中唯一的右值表达式是nullptr

请注意,此答案基于对问题的先前编辑,其中MyAwesomeClassString class。

您的String class 并不是真正的字符串 class 因为它不拥有基础字符串数据。 它更类似于std::string_view

我可以看到你有两种途径可以追求:

  1. 您的 class 拥有基础数据。 在这种情况下,class 是std::string的包装器,并且具有 std::string data member. Look up composition. No need to worry about lifetime as data member. Look up composition. No need to worry about lifetime as data member. Look up composition. No need to worry about lifetime as std::string` 表现良好。

  2. 您的 class 就像指向另一个字符串的“指针/参考/视图”。 在这种情况下,您有一个const char*可能还有std::size_t大小数据成员。 你基本上有一个std::string_view (除了设计std::string_view的智慧、专业知识和经验)。 由于您不拥有基础数据,因此您无法对基础数据的生命周期做任何事情。 class 的用户必须确保它不会以过期 object 的“YourStringView”结尾,就像他/她需要确保它不会以指向过期 ZA8CFDE6331BD49EB216Z6F96 的引用/指针结尾一样

这两种场景的语义大相径庭(作为 object 和指向对象的指针之间的区别)。


无论如何,我不建议您这样做,除非出于学习原因。 std::string_view已经存在,所以只需使用它。 如果您想要打印功能,请使用fmt 库或 C++ 格式库(基于提到的 fmt 库)。

即使您出于学习目的决定这样做,我也强烈建议您研究这些替代方案并从它们的做事方式中学习。


 MyAwesomeClass(const char* ptr) { this->data = ptr; } ~MyAwesomeClass() { delete data; }

哦不不不不! 不!!

请查看RAII0/3/5的规则。 您的 class 要么拥有尖锐的 object,要么不拥有。 如果它拥有它,那么它负责创建和删除它。 如果没有,那么它也做不到。 你不能有“一半的责任”,你负责删除它但不负责创建它。

在用户代码中,您永远不需要手动管理 memory。 使用 0 规则。

快速回答是您的 class 不拥有数据,而只是原始指针。 在某些情况下,您会看到删除运算符出现问题。 原始指针不是确保正确 object 所有权的好工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM