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
}