|
- std::ostringstream res;
- preprocessor_streambuf *buf = new preprocessor_streambuf(target_);
- {
- std::istream in(buf);
- new preprocessor_data(*buf, called_macros_, buffer, val.location, "", val.linenum, dir, val.textdomain, &symbol);
- res << in.rdbuf();
- }
- delete buf;
- strings_.back() += res.str();
复制代码 代码功能上是实现宏扩展,简单上说是宏替换。symbol:宏名;buffer:宏内容。例如有这样一个宏:
#define GUI_TINY__RESOLUTION
window_width = 640
window_height = 480
#enddef
则symbol内容是“GUI_TINY__RESOLUTION”,buffer内容是“\twindow_width = 640\r\n\twindow_height = 480\r\n”。但要注意,symbol类型是std::string,buffer则是一个指向std::stringstream类型的指针。
要讨论是否可能导致内存泄漏,要确定有哪些变量可能导致泄漏,集中看一条语句:- new preprocessor_data(*buf, called_macros_, buffer, val.location, "", val.linenum, dir, val.textdomain, &symbol);
复制代码 这是从堆中分配preprocessor_data,这条语句有三处是从堆中分配的。
一、preprocessor_data对象。new preprocessor_data(...)。
二、buf,preprocessor_streambuf对象。buf = new preprocessor_streambuf(target_);
三、buffer,std::stringstream对象。这分配过程没有在这部分,参考原代码,语句是std::stringstream *buffer = new std::stringstream。
答案是这段代码不会导致内存泄漏。现在看它们是在何时、如何被释放。 |
|