#include <iostream>
using namespace std;
class armon {
int a;
int b;
public:
armon(int newA, int newB) : a(newA), b(newB) {}
armon setA(int newA) {
a = newA;
return *this;
}
armon setB(int newB) {
b = newB;
return *this;
}
void print(void) { cout << a << endl << b; }
};
int main() {
armon s(3, 5);
s.setA(8).setB(9);
s.print();
}
Run Code Online (Sandbox Code Playgroud)
在C++的"this"指针上执行指针运算有什么合法和/或有趣的用途,如果有的话?
为了让SE对这个问题的长度感到满意,我将包含一些相关的代码.
class Foo
{
public:
Foo(bool terminate = false)
: _data(terminate ? -1 : 0)
{}
void Bar(void)
{
if (_data >= 0)
{
_data++;
this[1].Bar();
}
}
private:
int _data;
};
void main()
{
std::vector<Foo> vec;
vec.push_back(Foo());
vec.push_back(Foo());
vec.push_back(Foo());
vec.push_back(Foo());
vec.push_back(Foo(true));
vec[2].Bar();
}
Run Code Online (Sandbox Code Playgroud) 我正在编译Crypto ++库-O3
.根据Undefined Behavior Sanitizer(UBsan)和Address Sanitizer(Asan),它可以.该程序运行良好-O2
(-O3
在许多平台上).
根据Valgrind的说法,它也可以-O2
.在-O3
,Valgrind死于"你的程序只是试图执行Valgrind不理解的指令".我很确定这是因为SSE4指令和矢量化-O3
.
但是,我在某些平台上遇到了崩溃-O3
.这台特殊的机器是Fedora 22 i686,它有GCC 5.2.1.相关框架显示this=0xfffffffc
:
Program received signal SIGSEGV, Segmentation fault.
0x0807be29 in CryptoPP::DL_GroupParameters_IntegerBased::GetEncodedElementSize
(this=0xfffffffc, reversible=0x1) at gfpcrypt.h:55
55 unsigned int GetEncodedElementSize(bool reversible) const {return GetModulus().ByteCount();}
Run Code Online (Sandbox Code Playgroud)
我能说的最好,那个地址周围没有任何东西:
(gdb) info shared
From To Syms Read Shared Object Library
0xb7fdd860 0xb7ff6b30 Yes (*) /lib/ld-linux.so.2
0xb7eb63d0 0xb7f7a344 Yes (*) /lib/libstdc++.so.6
0xb7e005f0 0xb7e32bd8 Yes (*) /lib/libm.so.6
0xb7951060 0xb7980cc4 Yes (*) /lib/libubsan.so.0 …
Run Code Online (Sandbox Code Playgroud) 为什么this
在C++中被弃用?this
C++中的指针this
与Java中的指针有何不同?
早期版本的C++会让this指针改变; 通过这样做,程序员可以改变方法正在处理的对象.这个功能最终被弃用了,现在C++中的这个是const.
c++ ×4
this-pointer ×4
this ×2
c++11 ×1
cascading ×1
deprecated ×1
function ×1
gdb ×1
memory ×1
reference ×1