C++ 向向量添加新对象时,每次都返回相同的地址
我有密码: 我的矢量:C++ 向向量添加新对象时,每次都返回相同的地址,c++,C++,我有密码: 我的矢量:std::矢量电子表格 //create a new spreadsheet if it doesn't already exist. Link the session to the spreadsheet. bool server::createSpreadsheet(session* session, std::string name, std::string password) { std::cout << "beginning" <<
std::矢量电子表格代码>
//create a new spreadsheet if it doesn't already exist. Link the session to the spreadsheet.
bool server::createSpreadsheet(session* session, std::string name, std::string password)
{
std::cout << "beginning" << std::endl;
bool found = false;
for(int i = 0; i < spreadsheets.size(); i++)
{
spreadsheet test = spreadsheets.at(i);
std::cout << "spreadsheet name = " << &test << std::endl;
if(spreadsheets.at(i).name == name) //spread sheet already exists
{
found = true;
}
}
std::cout << "After For found = " << found << std::endl;
if(!found) //create a spreadsheet
{
spreadsheet * spr = new spreadsheet(name, password);
spr->linkSession(session);
spreadsheets.push_back(*spr);
}
else
{
std::cout << "in else" << std::endl;
return false;
}
return true;
}
是一个副本初始化。这意味着将创建一个新的电子表格对象test
,并将电子表格中的任何内容复制到(i)
中
然后您不断地获取新的test
对象的地址不是向量中值的地址。
测试的范围在for循环内。因此,编译器在每次迭代时都在相同的地址中分配它,并向您显示相同的地址
如果您需要电子表格中位于(i)
的地址,您必须直接获取其地址
std::cout << "spreadsheet name = " << &spreadsheets.at(i) << std::endl;
std::cout将电子表格复制到局部变量。然后输出局部变量的地址
如果要在向量本身中输出电子表格的地址,可以执行以下操作:
标准::cout
好像每次都放一样的东西
不是。只是临时的局部变量(test
)位于内存中的一个特定位置,当然地址不会改变。您必须检查对象的内容才能区分它们
此外,您使用vector
和new
的方式至少是非常错误的。您正在推回新的分配的电子表格对象的副本,多余地调用副本构造函数,然后松开指向原始对象的指针,导致内存泄漏。从向量中检索对象时,再次复制它。你为什么不用推荐信呢
spreadsheet spr(name, password);
spr.linkSession(session);
spreadsheets.push_back(spr); // this copies too, but at least only once
// ...
/* optionally: const */ spreadsheet &test = spreadsheets.at(i);
此外,建议使用迭代器对向量进行迭代:
for (vector<spreadsheet>::iterator it = spreadsheets.begin(); it != spreadsheets.end(); it++) {
// use `*it` to access the current element
}
for(vector::iterator it=spreadsheets.begin();it!=spreadsheets.end();it++){
//使用“*it”访问当前元素
}
您正在泄漏内存,因为进入向量的只是动态分配的对象的副本。实际上,当初始化中出现=
时,它不是赋值。它是复制初始化(在本例中基本上只是复制构造)。但无论如何+1,因为这是一个很好的答案。修正了。当我向向量中添加一个对象时,它会复制并添加它吗?
spreadsheet spr(name, password);
spr.linkSession(session);
spreadsheets.push_back(spr); // this copies too, but at least only once
// ...
/* optionally: const */ spreadsheet &test = spreadsheets.at(i);
for (vector<spreadsheet>::iterator it = spreadsheets.begin(); it != spreadsheets.end(); it++) {
// use `*it` to access the current element
}