可以在不取消引用的情况下递增指针,但仍然存在segfault或具有其他(未)定义的恶意
Can incrementing a pointer without dereferencing still segfault or have other (un)defined nastiness?
我在网上找到的所有关于递增指针导致segfault的例子都涉及到指针的取消引用——如果我只想递增它(例如在for循环结束时),而我不在乎它是否会在无效内存中结束,因为我不会再使用它了。例如,在这个程序中,我只需要每次迭代递增4,但在上一次迭代后,我再也不会取消引用这些指针。
float* leftRowPointer, resultRowPointer;
// assume they were correctly initialized
for (unsigned int i = 0; i < 4; ++i, leftRowPointer += 4, resultRowPointer += 4) {
// do some stuff
}
我需要做这样的事情吗?
for (unsigned int i = 0; i < 4; ++i) {
// same stuff
if (i != 3) {
leftRowPointer += 4;
resultRowPointer += 4;
}
}
有没有更好的方法来完成我想要做的事情?
当我自己尝试过的时候,似乎没有什么不好的事情发生,但这很难保证它会一直有效,不幸的是,我在工作中无法使用Valgrind或类似的产品。
我们使用的是C++11标准fwiw,我在其中找不到任何直接适用于此的东西,但我会第一个承认,我对该标准还不够了解,不知道在哪里可以找到它。
第5.7节,"加法运算符",第5段规定了这一点——加法本身的结果是未定义的;即使从不取消引用指针,程序也是无效的。
如果指针操作数和结果都指向相同的数组对象或经过数组对象的最后一个元素的一个数组对象,评估不得产生溢出;否则,行为未定义。
即使允许分段,也极不可能分段,但它仍然没有定义。
如果只是为指针分配无效引用是个问题,那么将指针初始化为NULL
也是个问题。所以你的具体问题的答案是否定的。
相关文章:
- C++模板来检查友元函数的存在
- 既然存在危险,为什么项目要使用-I include开关
- 我们可以访问一个不存在的联盟的成员吗
- C++中带有List类的迭代器Segfault
- C++:对不存在的命名空间使用命名空间指令
- C++quit()函数中可能存在作用域问题
- C++擦除(如果存在)
- 使用Vulkan hpp vk::enumerateInstanceVersion()会导致segfault
- g++ 说函数不存在,即使包含正确的标头
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 有了gcc,是否可以链接库,但前提是它存在
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- C++Builder中的OnClick事件签名存在问题
- 如何正确地将分支添加到已存在的树中
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 如何检查QList中是否存在值
- 使用clang编译时regex-segfault,可能存在编译器错误
- 可以在不取消引用的情况下递增指针,但仍然存在segfault或具有其他(未)定义的恶意
- boost::filesystem::在linux上存在segfault