c ++分配变量时未处理的异常访问冲突

时间:2015-09-14 17:07:28

标签: c++ memory vector

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,它会给我随机数字,因为变量项将被销毁,指针将指向任何内容。

2 个答案:

答案 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()与智能指针向量一起使用以避免手动删除。