Wlo*_* K. 10 c++ memory-corruption c++11
我在这段代码中有内存损坏:
#include <string>
#include <iostream>
#include <vector>
#include <initializer_list>
int main() {
std::vector<std::initializer_list<std::string>> lists = {
{
{"text1"},
{"text2"},
{"text3"}
},
{
{"text4"},
{"text5"}
}
};
int i = 0;
std::cout << "lists.size() = " << lists.size() << std::endl;
for ( auto& list: lists ) {
std::cout << "lists[" << i << "].size() = " << lists[i].size() << std::endl;
int j = 0;
for ( auto& string: list ) {
std::cout << "lists[" << i << "][" << j << "] = "<< string << std::endl;
j++;
}
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
样本输出:
lists.size() = 2
lists[0].size() = 3
lists[0][0] = text10?j ????text2H?j ????text3`?j ????text4????text5????????q
Run Code Online (Sandbox Code Playgroud)
问题在于std::initializer_list
.改变std::initializer_list
以std::vector
解决问题.
问题是为什么会发生内存损坏std::initializer_list
?
因为 std::string 对象在此行之前被销毁:
int i = 0;
如果 std::string 在其析构函数和构造函数中具有调试输出。您将看到类似以下内容: std::string::string 5 次、 std::string::~string 5 次,之后
列表.size() = 2
由于initializre_list不包含std::string对象的副本,它们(临时std::string对象0刚刚在';'之前创建和销毁)
例如,在这样的表达式中引用 std::string 对象:
std::cout << std::string("17");
但是,如果您在示例中将 std::string 替换为“const char *”,我想一切都应该有效。