【发布时间】:2011-12-29 11:31:14
【问题描述】:
我正在尝试为我正在制作的一种树编写一段代码,如果一个节点不存在,我想抛出一个异常,显示哪个节点不存在。即:
Trie t = Trie();
try {
t.get('a');
} catch(NoSuchNode e) {
cout << e.what() << endl;
}
如果节点存在,这段代码应该什么都不做,否则打印给定的错误,这是我的异常代码(我使用 std::exception,因为这似乎是个好主意):
class NoSuchNode : public std::exception
{
private:
char *_node_name;
public:
NoSuchNode(const char *node_name) { _node_name = new char(*node_name); }
virtual const char* what() const throw()
{
std::stringstream ss;
ss << "There exists no node for: " << _node_name << ".";
const std::string& tmp = ss.str();
return tmp.c_str();
}
};
这可以正常工作,valgrind 也不会在无效读取上给出任何错误,所以我想这很好吗?现在我的问题是,在我想出这个解决方案之前,我刚刚改变了:
_node_name = new char(*node_name);
到:
_node_name = node_name;
这样我就不需要为它分配更多空间。问题是有时它并没有真正打印任何好的数据,有时是一个字符,甚至更多。不是我所期望的。此外,valgrind 抱怨说我读到了我可以使用的内存。为什么是这样?我敢打赌,如果 std::string 只是得到一个指向它认为是空终止字符串的 char 的指针,因此会尝试从内存的开头读取,直到找到空字符?这是正确的吗?解决这个问题的正确方法是什么?我应该像我所做的那样按值传递数据吗?
添加: 每个节点应该只保存一个字符,仅此而已,char 传递的所有内容都只是一个字符,仅此而已。所以可以说我没有字符中的字符串。
原来我真正感兴趣的是流如何处理 char* 输入。 感谢您的回答!
如果我的代码有其他问题,您有时间请告诉我!
提前致谢!
【问题讨论】: