将新对象添加到向量中,每次都返回相同的地址
adding new object to vector, returns the same address every time
我有代码:
我的矢量:std::vector<spreadsheet> spreadsheets;
//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;
}
我希望每次found
是false
时都能创建一个新的电子表格对象,并将其放置在向量中。但根据我得到的输出,似乎每次都放同一个对象?我不知道这里发生了什么事?
运行多次后输出:
beginning
spreadsheet name = 0x7fff568bce10
spreadsheet name = 0x7fff568bce10
spreadsheet name = 0x7fff568bce10
spreadsheet name = 0x7fff568bce10
spreadsheet name = 0x7fff568bce10
spreadsheet name = 0x7fff568bce10
spreadsheet name = 0x7fff568bce10
spreadsheet name = 0x7fff568bce10
spreadsheet name = 0x7fff568bce10
将电子表格复制到本地变量。然后输出局部变量的地址。
如果你想在矢量中输出电子表格的地址,你可以这样做:
std::cout<lt;"电子表格name="<lt&电子表格[i]<lt;std::endl;
好像每次都放同一个物体?
没有。只是临时的局部变量(test
(位于内存中的一个特定位置,当然地址不会改变。您必须检查对象的内容才能区分它们。
此外,您使用vector
和new
的方式至少是非常错误的。您正在推回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
}
spreadsheet test = spreadsheets.at(i);
是复制初始化。这意味着创建了一个新的电子表格对象test
,并且spreadsheets.at(i)
中的任何内容都将按值复制到该对象。
然后,您不断地获取新test
对象的地址不是矢量中值的地址
test
的作用域在for循环内。因此,编译器在每次迭代中都会将其分配到相同的地址,并向您显示相同的地址。
如果你想要spreadsheets
中at(i)
的地址,你必须直接取其地址
std::cout << "spreadsheet name = " << &spreadsheets.at(i) << std::endl;
相关文章:
- 返回地址上的WriteProcessMemory
- 在字符串函数的指针中返回地址
- 英特尔 Pin:如何获取系统调用的返回地址
- 如何使用C 给出的地址覆盖汇编器堆栈的返回地址
- 指针不起作用,返回地址不是值
- Linux x64堆栈在信号处理程序内部展开,以修改返回地址
- 如何在函数中获取函数返回地址
- CPP - 使用 * 或 & 返回地址
- 我真的返回地址或参考临时吗?
- 从缓冲区指针计算堆栈中的返回地址
- 堆栈上的线程返回地址是什么
- 运算符 new[] 的返回地址与数组的实际地址之间的差异
- 这些本地函数的返回地址之间有什么区别
- 同时返回地址和值的函数
- 从std::vector::operator[]获取返回地址做什么
- 在返回地址之前清空指针
- 如何找出在 c++ 中更改函数返回地址的原因
- 局部变量的返回地址和程序仍然有效
- 返回地址在C
- 当操作符地址可以设置为普通变量时,为什么要求从函数返回地址?