相关疑难解决方法(0)

为什么我不应该在"删除"之后尝试使用"this"值?

C++的这一段中,delete this讨论了构造的使用.列出了4个限制.

限制1到3看起来很合理.但是为什么限制4在那里我"必须不检查它,将它与另一个指针进行比较,将它与NULL进行比较,打印它,投射它,用它做任何事情"?

我的意思this是又一个指针.为什么我不能把reinterpret_castint或者叫它printf()输出它的值?

c++ undefined-behavior

27
推荐指数
3
解决办法
1927
查看次数

C++实现中"无效指针值"转换的文档

根据C++标准,每个实现都必须记录"实现定义的行为":

1.3.11 [defns.impl.defined] 实现定义的行为

行为,对于格式良好的程序构造和正确的数据,这取决于实现和每个实现文档

读取无效指针值具有实现定义的行为(请参阅4.1左值到右值转换[conv.lval]):

如果glvalue引用的对象包含无效指针值(3.7.4.2,3.7.4.3),则行为是实现定义的.

(引自n4527草案,但是"通过无效指针值间接并将无效指针值传递给释放函数的行为具有未定义的行为.无效指针值的任何其他使用都具有实现定义的行为."已经在3.7中. 4.2 [basic.stc.dynamic.deallocation]自至少草案n3485以来的释放功能

但是,许多流行的实现并未定义此行为,许多专家将此描述为"未定义的行为".

遗漏明确文件的一个可能原因是,据我所知,"附录后的标准草案"中出现的"实施定义行为指数"中缺少对"无效指针值"的评估.

这是标准中的缺陷吗?自C++ 14以来,是否有任何公开的缺陷报告或委员会行动?

c++ pointers language-lawyer

13
推荐指数
1
解决办法
254
查看次数

可以递增指针而不解除引用仍然是段错误或具有其他(未)定义的恶意吗?

我在网上找到的关于递增指针导致段错误的所有例子都涉及指针的取消引用 - 如果我只想增加它(例如在for循环结束时),我不会如果它最终在无效的内存中,因为我不会再次使用它.例如,在这个程序中我只需要每次迭代一步一步,但是在最后一次迭代之后我再也没有取消引用这些指针.

float* leftRowPointer, resultRowPointer;
// assume they were correctly initialized

for (unsigned int i = 0; i < 4; ++i, leftRowPointer += 4, resultRowPointer += 4) {
    // do some stuff
}
Run Code Online (Sandbox Code Playgroud)

我需要做这样的事吗?

for (unsigned int i = 0; i < 4; ++i) {
    // same stuff
    if (i != 3) {
        leftRowPointer += 4;
        resultRowPointer += 4;
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来完成我想要做的事情?

当我自己尝试时,似乎没有什么不好的事情发生,但这并不能保证它会一直有效,不幸的是我在工作中无法访问Valgrind或类似的东西.

我们正在使用C++ 11标准,fwiw,我找不到任何直接适用于此的内容,但我会是第一个承认我不太了解标准的人知道在哪里寻找它.

c++ pointers memory-management segmentation-fault undefined-behavior

8
推荐指数
1
解决办法
252
查看次数

访问无效指针并获取其地址

考虑这样的代码:

std::vector<int> vec { 1, 2, 3 };
auto addr = &*vec.end();
Run Code Online (Sandbox Code Playgroud)

或简化:

int* ptr = 0;
auto addr = &*ptr;
Run Code Online (Sandbox Code Playgroud)

显然auto val = *ptr;会出现段错误.因此&*ptr,不会以相同的方式访问内存.为什么会这样?标准中是否有特定条目?

c++ memory stl

1
推荐指数
1
解决办法
118
查看次数