我遇到了我抛出的异常类的一个非常奇怪的行为(至少对我来说)。我要做的是通过new在异常类的构造函数中为字符串分配内存,并用字符填充它。到目前为止,一切都很好。在调试代码时,我可以在Visual Studio中看到指针实际上具有正确的内容。

现在,奇怪的事情发生了。我的下一个断点是在catch-块中,异常在构造后传递到该块-在这里,我可以在调试器中看到异常对象中包含的字符串的内容已严重损坏。即使地址完全没有改变!因此,似乎字符串的内容被破坏了。

因此,我在异常析构函数中放置了一个断点,实际上,在进入catch-块之前调用了该断点。因为我学会了通过引用catch块来传递异常,这使我非常困惑。但是,如果在我可以访问动态创建的数据之前调用析构函数,那有什么好处呢?

我构建了一个最小的示例来显示我所处的情况:

#include <iostream>
#include <cstring>

class test_exception {
public:
    test_exception();
    ~test_exception() {
        delete[] _msg;
    }

    // Getter Functions
    char* errorMessage() const {
        return _msg;
    }
private:
    char* _msg;
};

test_exception::test_exception()
{
    _msg = new char[22];
    strcpy(_msg, "This is a test string");
}

int main(int argc, char* argv[])
{
    try {
        throw test_exception();
    } catch (const test_exception& err) {
        std::cout << err.errorMessage() << std::endl;
    }

    std::cin.get();

    return 0;
}

如果有人可以告诉我这是否是奇怪的MS行为,或者如果我误解了应该如何使用try-catch-块,那将是一个创造。

最佳答案

抛出异常时将其复制(或在C++ 11中移动)。引用C++ 11,§15.1/ 3:



由于test_exception违反了rule-of-three(或对于C++ 11,rule-of-five),因此在您输入test_exception::_msg块时,catch已被删除。

关于c++ - char指针的内容在传递给catch块时似乎被删除了,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10109971/

10-15 07:23