分配新字符串崩溃了吗?

时间:2016-10-31 03:28:40

标签: string visual-c++

我试图用动态数组编写我的第一个真正的程序,但是我遇到了一个我无法理解的问题。基本上,我试图采用动态数组,将其复制到临时数组中,再向原始数组添加一个地址,然后将所有内容复制回原始数组。现在原始数组的地址比以前多一个。尝试使用int时,这非常有效,但字符串会导致程序崩溃。这是我遇到的代码的一个例子:

void main()
{
int x = 3;
std::string *q;
q = new std::string[x];

q[0] = "1";
q[1] = "2";
q[2] = "3";

    x++;
    std::string *temp = q;
    q = new std::string[x];
    q = temp;
    q[x-1] = "4";

    for (int i = 0; i < 5; i++)
    std::cout << q[i] << std::endl;
}

如果我要使q和temp成为指向int而不是string的指针,那么程序运行就好了。非常感谢任何帮助,我已经坚持了一两个小时。

1 个答案:

答案 0 :(得分:1)

q = temp只执行浅拷贝。您丢失了原始q及其指向的所有字符串。

由于您重新分配q以包含4个元素,但随后立即重新分配temp(仅分配了3个元素),现在访问(并分配)x处的元素是在数组范围之外。

如果你出于某种原因必须这样做,它应该是这样的:

auto temp = q;
q = new std::string[x];

for(int x = 0; x < 3; ++x)
    q[x] = temp[x];

delete [] temp;
q[x] = 4;

然而,这显然比在C ++中执行此操作的惯用方法更复杂且更容易出错。最好改为使用std::vector<std::string>