C++ 无效双指针干扰另一个
C++ Void double pointer interference with another
我正在尝试做一个涉及重载new和删除的项目。我将一个 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的声明。是的,很清楚我并没有释放这些可怜的双指针。我只是想用最简单的术语来创造问题。
乘数的大小不应该在那里:
*(allocArray + i*sizeof(void*))
// ^^^^^^^^^^^^^^ this shouldn't be here
void**
是强类型的。它通过指针算法参与适当的偏移计算。这里不需要偏移量的大小计算。因此,该循环似乎是为了转储序列中的指针值而精心制作的,应该是:
for(int i=0; i<allocArraySize; i++)
{
std::cout<< i << " = " << allocArray[i] << "n";
}
您错误地索引指针i * sizeof(void*)
而不是i
。
for(int i=0; i<allocArraySize; i++){ allocArray[i] = nullptr; }
首先,你不应该在C++代码中使用calloc。特别是如果你的程序同时使用新表达式和calloc\malloc,它可能会导致由于不匹配的删除器而导致UB。
allocArraySize
有类型void**
,所以它是指向指针的指针。表达式的结果*allocArraySize
具有与void*
或uintptr_t
类型相同的大小。带有指针的算术会自动按指向下一个相同类型对象所需的量递增指针。
C++编写它的方法甚至不需要如此晦涩难懂的知识,您要做的就是使用一个新表达式并使用空列表对其进行列表初始化,以获得与calloc
在 C 中相同的效果。
void** allocArray = ::new void*[allocArraySize] {};
for(int i = 0; i < allocArraySize; ++i)
{
std::cout<< i << " = " << allocArray[i] << "n";
}
当从重载的 new 中使用 new/delete 时,必须使用::
,否则会导致无限递归。
allocArray[i]
相当于*(allocArray + i)
重载新\删除。但真正C++方法是避免裸指针,并在可能的情况下使用容器。New\delete 可能是对某些内存池类的使用进行包装。
// 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";
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- C++试图读取一个文件并输出到另一个文本文件
- 如何将指针从一个void函数传递到另一个C++
- 如何从另一个文件继承私有成员变量和公共函数
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 如何在C++中将函数发送到另一个进程
- C++ 无效双指针干扰另一个