首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >经验28:避免返回内部对象的句柄

经验28:避免返回内部对象的句柄

作者头像
AI老马
发布于 2026-01-13 14:51:37
发布于 2026-01-13 14:51:37
1580
举报
文章被收录于专栏:AI前沿技术AI前沿技术

摘要:返回内部变量的指针是危险的,尽量不要这样做。

1,内部数据被返回的引用修改

返回内部变量指针的例子

代码语言:javascript
复制
// class for representing points
class Point {
public:
    Point(int x, int y);
    ...
    void setX(int newVal);
    void setY(int newVal);
    ...
};

struct RectData {   // Point data for a Rectangle
    Point ulhc;     // ulhc = " upper left-hand corner"
    Point lrhc;     // lrhc = " lower right-hand corner"
};

class Rectangle {
...
private:
    std::tr1::shared_ptr<RectData> pData;// see Item 13 for info on tr1::shared_ptr
};

trick: 为了保证对象 Rectangle 对象尽可能的小,将需要的数据保存在外部的变量中。另外:对于自定义的数据类型(Point),传递指针比传值更加的高效,所以定义了如下的函数:

代码语言:javascript
复制
class Rectangle {
public:
    ...
    Point& upperLeft() const { return pData->ulhc; }
    Point& lowerRight() const { return pData->lrhc; }
    ...
};

以上代码会造成Point 对象修改!有两点需要注意。

  • 两个公有函数upperLeft 和 lowerRight 被设置为const,本意是调用的client 只能读取,不能修改。
  • 但是其返回了私有成员变量的引用,造成了client 可以随意的修改Point 的数据
代码语言:javascript
复制
Point coord1(0, 0);
Point coord2(100, 100);
const Rectangle rec(coord1, coord2); // rec is a const rectangle from
// (0, 0) to (100, 100)
rec.upperLeft().setX(50); // now rec goes from
// (50, 0) to (100, 100)!
2,为返回引用加上const 限制

解决方式为:给返回的引用机上const 限制。

代码语言:javascript
复制
class Rectangle {
public:
    ...
    const Point& upperLeft() const { return pData->ulhc; }
    const Point& lowerRight() const { return pData->lrhc; }
    ...
};

尽管有const 的加持,返回内部变量的指针,会造成“野指针”的问题。比如以下的例子

代码语言:javascript
复制
class GUIObject {... };
// value; see Item 3 for why return type is const
const Rectangle boundingBox(const GUIObject& obj);  

GUIObject *pgo; // make pgo point to some GUIObject
...
// get a ptr to the upperleft point of its
const Point *pUpperLeft = &(boundingBox(*pgo).upperLeft()); 
// bounding box

当调用boundingBox 函数时,会产生临时的变量tmp,且把临时变量的upperLeft 变量的地址,赋值给了pUpperLeft 变量,当离开该语句时,tmp 变量被销毁,此时的pUpperLeft 就成为了“野指针”。

总结:

尽量的避免返回内部变量的句柄!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 1,内部数据被返回的引用修改
  • 2,为返回引用加上const 限制
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档