C ++变量不再存在

时间:2011-04-14 07:07:27

标签: c++ memory memory-leaks

#include <exception>
#include <iostream>
#include <cstdio>

using namespace std;

class BaseException : exception {
public:
    BaseException(const char* message) : message(message) {}
    const char* getMessage() {
        return message;
    }
private:
    const char* message;
};

void wrong() {
    unsigned short int argumentCallCounter = 1;

    /// @todo check why commented below does not work ?!
    // char tmp[13 + sizeof(argumentCallCounter)];

    /// @todo but this works
    char* tmp = new char[13 + sizeof(argumentCallCounter)];
    sprintf(tmp, "No %u argument", argumentCallCounter);

    throw BaseException(tmp);
}

int main(int argc, char** argv) {
    try {
        wrong();
    } catch (BaseException e) {
        cout << e.getMessage() << endl;
    }

    return 0;
}

上面的代码有效,但在评论中,有一段代码段无效 char tmp[13 + sizeof(argumentCallCounter)];
我知道它不起作用,因为当程序离开函数wrong时,变量tmp不再存在 任何人都可以帮忙吗?

还有我写的决定:
char* tmp = new char[13 + sizeof(argumentCallCounter)];
这也不好,因为当程序完成时,会有内存泄漏,因为没有人删除tmp

4 个答案:

答案 0 :(得分:4)

我经常抛出一个用std :: string初始化的std :: runtime_exception。

答案 1 :(得分:3)

http://www.cplusplus.com/reference/iostream/stringstream/ http://www.cplusplus.com/reference/std/stdexcept/runtime_error/

void wrong() {
    unsigned short int argumentCallCounter = 1;

    std::stringstream ss;
    ss << "No " << argumentCallCounter << " argument";

    throw std::runtime_error(ss.str());
}

答案 2 :(得分:2)

//why commented below is not works
char tmp[13 + sizeof(argumentCallCounter)];

它不起作用,因为tmp是函数的本地函数,并且在退出函数后它不再存在,但您仍然尝试从main()访问它。

我建议您在std::string和其他任何地方使用BaseException

我还建议您通过const引用来捕获异常:

catch (const BaseException & e)
//     ^^^^^ note          ^ note

编辑:

按如下方式实施BaseException

class BaseException : std::exception 
{
public:
    BaseException(std::string msg) : message(msg) {}

    //override std::exception::what() virtual function
    virtual const char* what() const throw()
    {
        return message.c_str();
    }

private:
    std::string message;
};

将其用作:

 try
 { 
    //some code that might throw BaseException
 }
 catch (const BaseException & e)
 {
       cout << "exception message : " << e.what() << endl;
 }

编辑:

wrong()实施为

void wrong() {
    unsigned short int argumentCallCounter = 1;

    std::stringstream ss;
    ss << "No " << argumentCallCounter << " argument";

    throw BaseException(tmp.str());
}

答案 3 :(得分:0)

“不行”是什么意思?

BaseException应该复制从构造函数中获取的字符串,并为其创建本地副本。然后,wrong函数可以在任何情况下解除分配。

当你这样做时,本地tmp数组应该再次工作。