【问题标题】:Call the member function, although the object does not exist调用成员函数,虽然对象不存在
【发布时间】:2017-05-08 16:31:55
【问题描述】:

在下面的代码中,为什么我可以调用printAlternativ 而不能调用print? 据我了解,该对象应该被删除,并且都不应该工作。

using namespace std;

class MemTest
{
public:
    MemTest(string);
    ~MemTest();
    void print();
    void printAlternative();
    string name;
};

void MemTest::print() {
    cout << "Print: " << name << "\n";
}

void MemTest::printAlternative() {
    cout << "Print Alternative\n";
}

MemTest::MemTest(string n) {
    cout << "Constructor\n";
    name = n;
}

MemTest::~MemTest() {
    cout << "Destructor\n";
}

void call(MemTest *b) {
    MemTest a("TestName");
    a.print();
    b = &a;
}

int main()
{
    MemTest *b = NULL;
    call(b);
    b->print(); // This crashes
    // b->printAlternative(); This works

    return 0;
}

【问题讨论】:

  • 欢迎来到未定义行为领域。唯一的规则是没有规则。
  • 听说过new运营商
  • 简短回答 - 因为printAlternativ 不访问该类的任何成员,因此技术上不需要实例。但这不能保证有效。
  • call 函数对main 中的变量b 没有影响——b 始终是空指针。
  • @Sniper 是的,但这不是我的问题。我只是将其视为未定义的行为,因为我没有找到任何其他解释。

标签: c++ object memory member


【解决方案1】:

在 call() 对象被破坏后,现在对象 b 没有任何对象的任何引用,并且您正试图访问对象的“名称”数据成员,因为它会崩溃。 您可以通过添加 cout

以及为什么其他人正在工作,因为成员函数与类关联并在我们第一次声明对象时被分配,而编译器仅在 destructor() 中滑动数据成员

【讨论】:

  • 我可以依赖这种行为吗,因为您似乎在暗示这是设计使然的行为。你有任何证据吗,因为我没有找到任何证据。
  • 正如我们所知,函数只在内存中初始化一次,并且适用于每个对象,每次调用数据时只有堆栈更改。因为那个析构函数没有滑动功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 2010-09-26
相关资源
最近更新 更多