得到返回地址

class procedure TList.Error(const Msg: string; Data: Integer);

  function ReturnAddr: Pointer;
  asm
          MOV     EAX,[EBP+4]
  end;

begin
  raise EListError.CreateFmt(Msg, [Data]) at ReturnAddr;
end;

今天上午研究amingoo的怎么访问类的私有成员,涉及到了list删除函数delete,首先判断删除的项是否存在,如果不存在则调用error函数,提示异常。
Error函数中的内部函数ReturnAddr,代码很简单,返回的是下条指令的地址即ebp+4,函数返回时通过ret指令得到继续执行得下一条指令的代码就是通过ebp+4得到的。进入子过程前,先将EIP压栈,从子过程返回时,从堆栈返回地址继续执行。
borland的东西果然精捍,看来我得多看看vcl源码了.

### C++ `std::vector` 下标运算符返回元素地址的方法 在C++中,当使用下标运算符(`operator[]`)访问`std::vector`容器内的元素时,默认情况下会直接返回对应位置上的元素副本。然而,在某些场景下可能希望获取到的是元素的引用或是其内存地址。 对于非const对象而言,可以通过重载`operator[]`来返回指向内部存储数据类型的引用,从而允许外部代码通过这个引用来间接修改向量中的实际值[^1]。具体来说就是像这样: ```cpp class IntList { private: std::vector<int> list; public: // 构造函数省略... /// 非const版本的下标运算符重载, /// 可以用于读取也可以用于写入操作。 int& operator[](size_t index) { return list[index]; } /// const版本的下标运算符重载, /// 仅能用于读取而不能更改原有数值。 const int& operator[](size_t index) const { return list[index]; } }; ``` 上述例子展示了如何为自定义类提供两种不同形式的`operator[]`实现——一种是非const版本,它能够支持对所选索引处的数据项进行更新;另一种则是const版本,适用于那些只打算查询而不做任何改动的情况。值得注意的是,这里并没有显式地返回指针而是选择了引用的方式,这是因为引用更接近于常规语法习惯,并且可以更好地表达出“别名”的概念[^3]。 如果确实需要获得某个特定元素的实际地址,则可以在客户端代码里利用地址-of (`&`) 运算符轻松做到这一点: ```cpp #include <iostream> #include <vector> int main(){ std::vector<int> vec{1,2,3}; // 获取第一个元素的地址并打印出来 int* ptr = &(vec[0]); std::cout << "Address of first element: " << ptr << '\n'; // 或者直接这样做也行 std::cout << "&vec[0]: " << &vec[0] << "\n"; return 0; } ``` 这段程序片段说明了怎样借助标准库提供的接口以及基本的操作符组合起来达到目的。需要注意的一点是,尽管可以直接作用于`operator[]`的结果上加前缀`&`得到所需结果,但在性能敏感的应用场合应当考虑缓存住频繁使用的指针以减少不必要的开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值