std::vector <Item*> itemSlot;
itemSlot.resize(1);
Item testItem;
testItem.item_id = 99;
*itemSlot[0] = testItem; // ERROR
std::cout << "ID: " << itemSlot[0]->item_id << std::endl;
为什么会出错?
我知道我可以用:
itemSlot[0] = &testItem;
但我不想这样做,因为如果我在一个函数中创建项目并在一个函数中分配它,如果我在函数外调用itemSlot [0] - &gt; item_id,它会给我随机数字,因为变量项将被销毁,指针将指向任何内容。
答案 0 :(得分:2)
你有物品指针的向量。这样做通常是个糟糕的主意。共享指针会更好。如果你想使用指针,那么你应该为它们分配内存,所以你应该这样做:
itemSlot[0] = new Item;
访问之前。更好看的是:
Item* tmpItem = new Item;
itemSlot.push_back(tmpItem);
不要忘记随后释放记忆。改为使用共享指针或唯一指针
另一种方式:
itemSlot[0] = &testItem;
这也没关系,但是在testItem停止后,现有的vector仍将指向内存中的某个位置。
答案 1 :(得分:1)
的含义
*itemSlot[0] = testItem; // Copy-assign testItem into the item at index zero
完全不同于
itemSlot[0] = &testItem; // Place the address of testItem at index zero
如果你的索引为零Item
,那么第一个构造就可以工作,但是你没有:调用itemSlot.resize(1)
将nullptr
置于索引零中,因此取消引用它会导致未定义行为。
有几种解决方案可供选择:
vector
向量设为Item
而不是Item*
或Item *testItem = new Item()
并在结尾处致电delete
或new Item()
与智能指针向量一起使用以避免手动删除。