如何检查对象是不是已在 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 Pet
和const 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++ 中初始化/创建?的主要内容,如果未能解决你的问题,请参考以下文章
C++中静态成员变量(不支持在类定义中初始化不是常量的静态数据成员)
如何持续检查 AVAudioplayer 是不是已在 Swift 中播放完毕?