我试图用动态数组编写我的第一个真正的程序,但是我遇到了一个我无法理解的问题。基本上,我试图采用动态数组,将其复制到临时数组中,再向原始数组添加一个地址,然后将所有内容复制回原始数组。现在原始数组的地址比以前多一个。尝试使用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的指针,那么程序运行就好了。非常感谢任何帮助,我已经坚持了一两个小时。
答案 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>
。