【发布时间】:2020-04-08 11:02:27
【问题描述】:
我正在尝试做一个涉及重载 new 和 delete 的项目。我将一个 void 指针数组(指向分配的随机内存的指针)存储在一个双 void 指针中。当然,需要调整这个数组的大小以考虑更多的 void 指针。
这是数组的初始化,allocArraySize(int)设置为4。
void** allocArray = (void**) calloc ( allocArraySize, sizeof(void*) );
将所有值设置为 nullptr..
for(int i=0; i<allocArraySize; i++){ *(allocArray + i*sizeof(void*)) = nullptr; }
但是,在尝试调整数组大小时,我注意到当我创建一个新的临时数组(temp)来存储它们时,我原来的 void 指针数组被修改了。
// PRINTS THE ORIGINAL ARRAY
for(int i=0; i<allocArraySize; i++){std::cout<<i<<" = "<<*( allocArray + i*sizeof(void*))<<"\n";}
void** tempArray = (void**)calloc(allocArraySize, sizeof(void*));
// PRINTS THE ORIGINAL ARRAY
for(int i=0; i<allocArraySize; i++){std::cout<<i<<" = "<<*( allocArray + i*sizeof(void*))<<"\n";}`
请注意,我什至还没有将数组值放入临时数组中,我仍然遇到这个问题。这是为什么?为什么在确实初始化时将这个随机值分配给这个点?这个新的临时数组变量是怎么弄乱我的数组的?
注意:这基本上是完整的代码。唯一缺少的是主函数、iostream 和 allocArraySize 的声明。是的,我知道我没有释放这些可怜的双指针。我只是想尽可能用最简单的方式来制造问题。
【问题讨论】:
-
为什么 C++ 代码会使用 calloc...
-
仅供参考。将所有指针设置为
nullptr的循环毫无意义。在来自calloc的零填充之后,它们已经为空。并且您在打印期间的sizeof操作不应该存在。指针算法已经为您处理了偏移量。 -
allocArray + i*sizeof(void*)将在i大于 0 时超出数组的末尾,因为arrayAllocSize是 4。 -
请添加一个输入和输入的输出,如果可能的话还要加上预期的输出
-
这都是技术上未定义的行为,您应该使用容器,例如
vector。
标签: c++ memory void-pointers double-pointer