如何检查对象是不是已在 C++ 中初始化/创建?

Posted

技术标签:

【中文标题】如何检查对象是不是已在 C++ 中初始化/创建?【英文标题】:How do I check if an Object has been initialized/created in C++?如何检查对象是否已在 C++ 中初始化/创建? 【发布时间】:2015-05-12 23:37:22 【问题描述】:

所以我有以下课程......

class Pet

    public:
        Pet() : id(0),
            name("New Pet")
        

        

        Pet(const int new_id, const std::string new_name) : id(new_id),
            name(new_name)
        

        

        Pet(const Pet new_pet) : id(new_pet.id),
            name(new_pet.name)
        

        
    private:
        const int id;
        const std::string name;
;

然后在我的代码中的某处创建此类的实例,如下所示...

Pet my_pet = Pet(0, "Henry");

稍后在我的代码中,应该有一个事件导致该宠物被删除。 删除(我的宠物);

如何检查 my_pet 是否已初始化...

这样的东西有用吗?

if(my_pet == NULL)

    // Pet doesn't exist...

【问题讨论】:

my_pet 不需要删除,因为它不是动态分配的对象。你是说Pet* my_pet = new Pet(0, "Henry"); 吗? 您可能应该将您的const Petconst std::string 参数作为参考,这里Pet(const Pet new_pet) 和这里Pet(const int new_id, const std::string new_name) 为了提高效率,这里不需要复制数据。 【参考方案1】:

假设你的意思是

Pet* my_pet = new Pet(0, "Henry");

而不是Pet my_pet = Pet(0, "Henry"); 您可以像这样将 Pet 对象初始化为 NULL(或 C++11 的 nullptr):

Pet* pet = NULL; // or nullptr

然后给它分配一个Pet的实例:

pet = new Pet(0, "Henry");

这允许您在不调用未定义行为(通过未初始化的变量)的情况下检查 pet 的值:

if (pet == NULL) // or nullptr

    ...

【讨论】:

这就是我要找的东西,谢谢@Levi。我将如何强制删除宠物...例如,假设宠物被分配给 my_pet。但在某些时候,我想让 my_pet 不养宠物。这行得通吗...? my_pet = NULL; 你可以拨打delete pet @Ricky "那应该很好用。" 不,我真的不这么认为。您不需要自己管理new/´delete`。使用智能指针,正如我在回答中提到的那样。【参考方案2】:

delete(my_pet); 没有意义,使用的签名也没有意义(应该是delete my_pet;,如果有效)。

用你的代码

Pet my_pet = Pet(0, "Henry");

不涉及动态内存分配,因此您无需调用delete my_pet;

对象实例将在您调用Pet my_pet = Pet(0, "Henry"); 的范围离开后立即销毁。


至于您的评论“我将如何强制删除宠物。”,您应该使用dynamic memory management smart pointers,而不是致电new Pet() 并为强制删除而烦恼 em> 删除自己。

如果你真的需要为Pet 分配动态内存,不如使用类似

std::unique_ptr<Pet> my_pet(new Pet(0, "Henry"));`

【讨论】:

delete(my_pet) 完全有效 @Levi 当然??您确实注意到 my_pet 甚至不是指针变量,不是吗? 好吧,如果delete my_pet 有效,那么可以安全地假设delete (my_pet) 也有效 哦,等等,我的错,我误读了答案,意思是“你应该使用 delete my_pet 而不是 delete (my_pet)

以上是关于如何检查对象是不是已在 C++ 中初始化/创建?的主要内容,如果未能解决你的问题,请参考以下文章

检查插件是不是已在 jQuery 中初始化?

如何检查表是不是已在 Laravel 查询生成器中加入

C++中静态成员变量(不支持在类定义中初始化不是常量的静态数据成员)

如何持续检查 AVAudioplayer 是不是已在 Swift 中播放完毕?

如何检查用户 JID 是不是已在 XMPPFrameWork 中使用

如何检查重用标识符是不是已在 UITableView 中注册?