【问题标题】:i have trouble assigning a vector to another vector. The program crashes我无法将一个向量分配给另一个向量。程序崩溃
【发布时间】:2016-01-23 17:24:51
【问题描述】:

这是我实际代码的缩短版本。这也不运行。 线

tempPurchaseAndID[0] = tempPurchase;

导致崩溃。

#include<vector>
#include<iostream>
using namespace std;
int main()
{

    string* strTempPurchase = new string("", "");
    string* tempOneID = new string("", "");
    vector<string> temp;//if category name exists in his purchase
    vector<string*/*size of two*/> tempPurchase;
    vector<string*/*size of two*/> oneID;// vector for one id

    vector<string*>* tempPurchaseAndID{};
    tempOneID[0] = "2222";

    oneID.push_back(tempOneID);
    strTempPurchase[0] ="milk";
    strTempPurchase[1] = "3";
    tempPurchase.push_back(strTempPurchase);
    tempPurchaseAndID[0] = tempPurchase;
    tempPurchaseAndID[1] = oneID;
    std::cin.get();
    return 0;
}

有人可以看到问题并提出解决方案吗? 提前致谢。

附:我需要其他事情的指针,所以我不能删除指针

【问题讨论】:

  • 不要到处使用这些指针!这可能会解决您的问题。
  • 但我的项目中的其他事情需要它
  • 听起来很奇怪你应该需要它们,但通常你不会。您的实际项目可能存在严重的设计缺陷。
  • 你没有为tempPurchaseAndID分配任何内存,但是你试图覆盖它的元素。
  • 那我该如何解决呢?

标签: c++ vector stl crash assign


【解决方案1】:

正如已经指出的,您的问题始于指针。

首先vector&lt;string*&gt;* tempPurchaseAndID{}; 不是向量而是空指针。使用 tempPurchaseAndID[0] 延迟空指针会导致段错误。

最好只使用一个向量,而不是一个指向向量的指针:

vector<vector<string*> > tempPurchaseAndID;

但即使现在,您的程序仍然会在同一行崩溃,但这一次是因为另一个原因:tempPurchaseAndID 的长度为 0,并且其中没有索引为 0 的元素!所以还是用push_back比较好,在vector末尾添加元素:

tempPurchaseAndID.push_back(tempPurchase);
tempPurchaseAndID.push_back(oneID);

尽量减少指针的使用 - 它们是许多错误和错误的来源。

【讨论】:

  • 我做了矢量* tempPurchaseAndID{};因为我需要一个字符串数组的向量数组。是的,这很复杂,但这就是我所需要的。这就是为什么我不能退缩,因为 tempPurchaseAndID 是数组而不是向量
  • @user4384866 那么你需要vector >并且仍然可以使用push_back()。然而,指向字符串的向量的向量是一个非常复杂的结构,并且不容易使用......
  • 所以你认为在这里使用向量而不是数组会更好?
  • @user4384866 我不知道你的项目,但矢量更灵活,在大多数情况下是更好的选择。但是,如果你想要一个数组,你应该将它声明为一个:vector&lt;string*&gt; tempPurchaseAndID[2],因为vector&lt;string*&gt;* 只是一个指针,本身没有分配内存。
【解决方案2】:

std::vector 已经支持assignment operatorstd::string 也是如此。

我看不出你有什么理由在这里搞乱指针。复制指针不会为您提供您可能想要实现的目标。

【讨论】:

  • 好的,但是你知道问题出在哪里吗?
  • @user4384866 当然,问题是您使用的是上面提到的指针。
【解决方案3】:

您正在传递第一个字符串并尝试写入此处不存在的字符串:

strTempPurchase[0] ="milk";
strTempPurchase[1] = "3";

然后你在这里做一些类似的事情,但附加的问题是你从来没有真正创建 strTempPurchase 的实例:

tempPurchaseAndID[0] = tempPurchase;
tempPurchaseAndID[1] = oneID;

还要注意,通过指针处理向量并不理想。如果您调整向量的大小(例如使用 push_back),向量可以将其数据移动到另一个位置,从而使您的指针无效。

【讨论】:

  • 哦,我想我明白了。你知道怎么解决吗?
  • 您可以做很多事情。您可能不需要这些指针,因为您的字符串和向量是主要的。这意味着它们将一直存在,直到程序退出。如果你真的,真的需要将指针传递给它们,你可以使用操作符的地址。对于字符串,如果您需要一对字符串,我建议您使用容器,也许是 std::pair (或其指针)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
相关资源
最近更新 更多