这是一个使用-fsanitize = address标志编译C ++代码时常见的问题。它通常是由ASan(地址Sanitizer)引起的,ASan会检查内存中的缓冲区溢出错误。为了解决此问题,可以将以下代码示例用新的代码进行替换:
class Base { public: virtual void print() { std::cout << "Base Class" << std::endl; } };
class Derived : public Base { public: void print() override { std::cout << "Derived Class" << std::endl; } };
int main() { Base* b = new Derived; b->print(); delete b; return 0; }
替换成:
class Base { public: virtual void print() { std::cout << "Base Class" << std::endl; } };
class Derived : public Base { public: void print() override { std::cout << "Derived Class" << std::endl; } };
int main() {
Base* b = new Derived;
Derived* d = dynamic_cast
在新代码中,我们添加了一个dynamic_cast将Base指针转换为Derived指针,以便正确调用虚函数。这样就可以避免使用-fsanitize = address标志编译时可能遇到的崩溃问题。