【问题标题】:Push_back method of vector of pointers causes crash C++指针向量的 push_back 方法导致崩溃 C++
【发布时间】:2016-02-16 20:44:20
【问题描述】:

我正在尝试在 C++ 中添加指向向量的指针。因此:

          Puzzle * puzzleStart = new Puzzle();

          std::vector<Puzzle*> OPEN;

          OPEN.push_back(puzzleStart);

第一次推送指针,没有问题。第二次,它会导致崩溃。我猜问题是向量的大小,但我不明白为什么。还有什么其他的吗?

更新:你是对的,问题出在其他地方,我刚刚意识到它发生在我释放指针向量时。还有另一个问题,如果向量包含重复的指针,我认为。

   if (OPEN.size()!=0){
       for (int i = 0; i < OPEN.size(); ++i) {
      delete OPEN[i]; // Calls ~object and deallocates *tmp[i]
       }
      OPEN.clear();
       } 

我如何确保它不会尝试擦除所有已删除的指针?

【问题讨论】:

  • 向指针向量添加一个简单的指针不会使程序崩溃。发布带有错误消息的崩溃并添加代码,直到发生第二次崩溃。也许你不应该做一些矢量操作?您问题中的当前代码没有任何问题(尽管您可能希望使用智能指针,如果可能的话)。

标签: c++ pointers vector crash push-back


【解决方案1】:

你是对的,问题出在其他地方,我刚刚意识到它发生在我释放指针向量时。还有另一个问题,如果向量包含重复的指针,我认为。

       if (OPEN.size()!=0){
           for (int i = 0; i < OPEN.size(); ++i) {
          delete OPEN[i]; // Calls ~object and deallocates *tmp[i]
           }
          OPEN.clear();
           } 

我如何确保它不会尝试擦除所有已删除的指针?

【讨论】:

  • 您应该将其编辑到您的问题中,而不是将其作为答案发布。
【解决方案2】:

如果问题是指针重复,则应考虑不允许重复的容器,例如集合。例如:

std::set<Puzzle*> s;
Puzzle *puzz = new Puzzle();
auto insert_result = s.insert(puzz);

if(!insert_result.second)
{
    std::cout << "\"puzz\" was a duplication. No insertion made.\n";
}

// More items inserted into s, and used, etc.

for(auto p : s)
    delete p;

s.clear();

【讨论】:

  • 是的,虽然问题不是一个向量内的重复,而是两个向量之间的共享重复,那这种情况下是怎么做的呢?
  • 分配的资源应该始终只有一个“所有者”,例如指针。您的向量之一应该是所有指针的唯一所有者,并且应该在清除之前将它们全部删除。另一个向量永远不应该删除它包含的指针。您还必须确保在删除指针后永远不会取消引用它们。如果您的向量包含相交的指针集——也就是说,每个指针都有一些指针包含在另一个指针中,并且所有指针都不是明确的所有者——那么您就有问题并且需要重新考虑您的设计。
【解决方案3】:

删除指针时,将其设置为 nullptr。删除空指针不会导致崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 2015-12-06
    相关资源
    最近更新 更多