C 指针深副本

C++ Pointer Deep Copy

本文关键字:副本 指针      更新时间:2023-10-16

我正在尝试对整数数组的指针进行深层副本,并且在确定什么代码不必要地冗长且需要什么。

很难。

我要复制的指针只是一个简单的整数数组。

int* vertexArray = new int[G->size()];

它包含数字0至size() - 1作为其值。我的第一个是制作一个新的int*,其中等于顶点阵列,

int* shortestTour = vertexArray

,但我相信,每当我输入Vertexarray时,这都会使最短的变化变化。是用这样的循环进行深层复制的唯一方法

for(int i=0; i<G->size(); i++){
    shortestTour[i] = vertexArray[i];
}

,然后每次我找到比当前最短的旅行/路径时运行该循环?

编辑:这是用于旅行推销员问题的简单,蛮力实施。

正如您可能已经猜到的那样,深副本没有复制指针(毕竟,指针只是指向某些内存位置的地址),而是复制正在正在的内存由指针指向。

所以,如果您有

int* vertexArray = new int[G->size()];

深副本是

int* deepCopy = new int[G->size()];
for(size_t i = 0; i < G->size(); ++i)
    deepCopy[i] = vertexArray[i]; // copy the allocated memory 

当然,复制内存的更聪明,更快的方法,例如

std::memcpy(deepCopy, vertexArray, sizeof(int)*G->size()); // should be faster

浅副本只是复制指针,而不是内存,

int* shallowCopy = vertexArray;

shallowCopyvertexArray指针都会反映您将进行的任何修改,因为现在两者都指向相同的内存块。

您应该考虑是否需要深层副本。如果您只想共享数据,则可能不会。如果数据必须是"本地",那么您可能会这样做。