繁体   English   中英

C ++:删除了对象(使用new创建),但成员函数仍然有效(?)

[英]C++: object deleted (created with new) but member function still working (?)

出于好奇和实验目的,我编写了以下代码,现在试图了解删除后发生的事情...为什么cat对象仍然发出声音?

我使用的编译器版本:

g++ (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609

并编译代码:

g++ cat.cpp -pedantic -Wall -o cat

与其他编译器一起删除后调用meou()可能会崩溃。

我想知道

  • 为什么不崩溃
  • 我应该采取哪些预防措施

编码:

#include <iostream>
using namespace std;


class Cat
{
    public:
        Cat()  { cout << "Cat construct" << endl; }
        ~Cat() { cout << "Cat destruct" << endl; }
        void meow(); 
};

void Cat::meow(void)
{
    cout << "meow..." << endl;
}    

int main()
{
    Cat * pCat = new Cat;    
    pCat->meow();    
    cout << "pCat = " << pCat << endl;    
    delete pCat;    
    pCat = NULL;    
    cout << "pCat = " << pCat << endl;    
    pCat->meow();    
    cout << "why still meowing?!" << endl;    
    return 0;
}

输出:

Cat construct
meow...
pCat = 0x2147030
Cat destruct
pCat = 0
meow...
why still meowing?!

为什么不崩溃

因为取消引用nullptr或访问已删除的对象是未定义的行为。 C ++不需要崩溃,但是崩溃可能是未定义行为的结果。

我应该采取哪些预防措施

那是一个相当广泛的话题。 在C ++中,最重要的是不需要使用动态分配。 写:

Cat cat;
cat.meow();

如果您不能这样做,请使用std::unique_ptr

auto cat_ptr = std::make_unique<Cat>();
cat_ptr->meow();

如果您需要集合,请不要使用new[] 使用std::vector

std::vector<Cat> cats;
std::vector<std::unique_ptr<Cat>> cat_ptrs;

暂无
暂无

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

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