C++ Void双指针干扰另一个
C++ Void double pointer interference with another
我正在尝试做一个涉及重载新建和删除的项目。我将一个空指针数组(指向分配的随机内存的指针)存储在一个双空指针中。当然,需要调整此数组的大小以考虑进来的更多空指针。
这是数组的初始化,allocArraySize(int)设置为4。
void** allocArray = (void**) calloc ( allocArraySize, sizeof(void*) );
将所有值设置为 nullptr..
for(int i=0; i<allocArraySize; i++){ *(allocArray + i*sizeof(void*)) = nullptr; }
但是,当尝试调整数组大小时,我注意到当我创建一个新的临时数组 (temp) 来存储它们时,我原来的空指针数组被修改了。
// 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 的声明。是的,我很清楚我不会释放这些可怜的双指针。我只是想尽可能用最简单的术语来创建问题。
您错误地索引了指针 i * sizeof(void*)
而不是 i
。
for(int i=0; i<allocArraySize; i++){ allocArray[i] = nullptr; }
sizeof 乘数不应该存在:
*(allocArray + i*sizeof(void*))
// ^^^^^^^^^^^^^^ this shouldn't be here
void**
是强类型的。它通过指针算法参与适当的偏移量计算。这里不需要计算 sizeof 偏移量。该循环似乎是为了转储序列中的指针值而设计的,因此应该是:
for(int i=0; i<allocArraySize; i++)
{
std::cout<< i << " = " << allocArray[i] << "\n";
}
首先,您不应该在 C++ 代码中使用 calloc。特别是如果你的程序同时使用了 new 表达式和 calloc\malloc,它可能会由于不匹配的删除符而导致 UB。
allocArraySize
得到类型 void**
,所以它是指向指针的指针。表达式 *allocArraySize
的结果与 void*
或 uintptr_t
类型的 sizeof 相同。带指针的算术自动按指向下一个相同类型对象所需的数量递增指针。
C++ 编写它的方法甚至不需要这种神秘的知识,您应该做的就是使用一个新表达式并用空列表对其进行列表初始化,以获得与 calloc
相同的效果C.
void** allocArray = ::new void*[allocArraySize] {};
for(int i = 0; i < allocArraySize; ++i)
{
std::cout<< i << " = " << allocArray[i] << "\n";
}
在重载的内部使用 new/delete 时,必须使用 ::
否则会导致无限递归。
allocArray[i]
等同于 *(allocArray + i)
超载 new\delete 放在一边。但真正的 C++ 方法是避免裸指针并尽可能使用容器。 New\delete 可能是一些内存池 class.
的包装器
// do we really need a vector of pointers?
auto allocArray = std::vector<void*>(allocArraySize, nullptr);
int i = 0;
for( auto &v : allocArray )
std::cout<< (i++) << " = " << v << "\n";
在 C++20 中,由于 init 语句
,基于范围的 for 循环变得更加包含
for(int i = 0; auto &v : allocArray )
std::cout<< (i++) << " = " << v << "\n";
我正在尝试做一个涉及重载新建和删除的项目。我将一个空指针数组(指向分配的随机内存的指针)存储在一个双空指针中。当然,需要调整此数组的大小以考虑进来的更多空指针。
这是数组的初始化,allocArraySize(int)设置为4。
void** allocArray = (void**) calloc ( allocArraySize, sizeof(void*) );
将所有值设置为 nullptr..
for(int i=0; i<allocArraySize; i++){ *(allocArray + i*sizeof(void*)) = nullptr; }
但是,当尝试调整数组大小时,我注意到当我创建一个新的临时数组 (temp) 来存储它们时,我原来的空指针数组被修改了。
// 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 的声明。是的,我很清楚我不会释放这些可怜的双指针。我只是想尽可能用最简单的术语来创建问题。
您错误地索引了指针 i * sizeof(void*)
而不是 i
。
for(int i=0; i<allocArraySize; i++){ allocArray[i] = nullptr; }
sizeof 乘数不应该存在:
*(allocArray + i*sizeof(void*))
// ^^^^^^^^^^^^^^ this shouldn't be here
void**
是强类型的。它通过指针算法参与适当的偏移量计算。这里不需要计算 sizeof 偏移量。该循环似乎是为了转储序列中的指针值而设计的,因此应该是:
for(int i=0; i<allocArraySize; i++)
{
std::cout<< i << " = " << allocArray[i] << "\n";
}
首先,您不应该在 C++ 代码中使用 calloc。特别是如果你的程序同时使用了 new 表达式和 calloc\malloc,它可能会由于不匹配的删除符而导致 UB。
allocArraySize
得到类型 void**
,所以它是指向指针的指针。表达式 *allocArraySize
的结果与 void*
或 uintptr_t
类型的 sizeof 相同。带指针的算术自动按指向下一个相同类型对象所需的数量递增指针。
C++ 编写它的方法甚至不需要这种神秘的知识,您应该做的就是使用一个新表达式并用空列表对其进行列表初始化,以获得与 calloc
相同的效果C.
void** allocArray = ::new void*[allocArraySize] {};
for(int i = 0; i < allocArraySize; ++i)
{
std::cout<< i << " = " << allocArray[i] << "\n";
}
在重载的内部使用 new/delete 时,必须使用 ::
否则会导致无限递归。
allocArray[i]
等同于 *(allocArray + i)
超载 new\delete 放在一边。但真正的 C++ 方法是避免裸指针并尽可能使用容器。 New\delete 可能是一些内存池 class.
的包装器// do we really need a vector of pointers?
auto allocArray = std::vector<void*>(allocArraySize, nullptr);
int i = 0;
for( auto &v : allocArray )
std::cout<< (i++) << " = " << v << "\n";
在 C++20 中,由于 init 语句
,基于范围的 for 循环变得更加包含for(int i = 0; auto &v : allocArray )
std::cout<< (i++) << " = " << v << "\n";