C++内存越界问题及解决方法

与内存泄露相比,C++最令人头痛的问题是内存越界,而内存越界很多情况下是由于悬挂指针引起的。

假设一个指针变量:

Object * ptr;

使用ptr时,我们除了要判断ptr是否为0以外,还要怀疑它指向的对象是否有效,是不是已经在别的地方被销毁了。我们希望当它指向的对象被销毁时,ptr被自动置为0。

显然,C++没有这种机制,但是,可以借助于boost::weak_ptr做到这一点。

inline void null_deleter(void const *)
{
}
class X
{
private:
    shared_ptr<X> this_;
    int i_;
public:
    explicit X(int i): this_(this, &null_deleter), i_(i)
    {
    }
    X(X const & rhs): this_(this, &null_deleter), i_(rhs.i_)
    {
    }
    X & operator=(X const & rhs)
    {
        i_ = rhs.i_;
    }
    weak_ptr<X> weak_this() const { return this_; }
};

定义变量:

weak_ptr<X>ptr=x.weak_this(); //x为一个X对象

则当x被销毁时,ptr被自动置为无效。使用方法如下:

if(shard_ptr<X> safePtr =ptr.lock()) safePtr->do_something();

这种办法用于单线程中,因为x 对象可能是基于栈分配的。如果需要在多线程中访问X对象,那么最好的办法还是使用shared_ptr来管理对象的生命期。这样的话,对于safePtr,可以保证在safePtr的生命期内,它所指向的对象不会被其它线程删除。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, 内存
, 对象
, 数据越界
, this
, 越界
, shared ptr
, 数组越界 内存泄露
, c++ vector 越界
, 越界访问 段错误
, 内存越界
, 越界乱码
, 指向
生命期
内存访问越界怎么解决、内存泄漏及解决方法、解决足球经理内存问题、内存不能read解决方法、内存蓝屏的解决方法,以便于您获取更多的相关知识。

时间: 2024-08-20 00:27:08

C++内存越界问题及解决方法的相关文章

内存常见故障的解决方法

  内存常见故障的解决方法: 常见故障一:开机无显示 内存条原因出现此类故障一般是因为内存条与主板内存插槽接触不良造成,只要用橡皮擦来回擦试其金手指部位即可解决问题(不要用酒精等清洗),还有就是内存损坏或主板内存槽有问题也会造成此类故障. 由于内存条原因造成开机无显示故障,主机扬声器一般都会长时间蜂鸣(针对AwardBios而言). 常见故障二:Windows注册表经常无故损坏,提示要求用户恢复 此类故障一般都是因为内存条质量不佳引起,很难予以修复,唯有更换一途. 常见故障三:Windows经常

win7 msconfig最大内存设置为0解决方法

win7 msconfig最大内存设置为0解决方法 Windows 最大内存 本来想写写前因后果的,想想如果你现在也是这个问题的话,一定没时间看完整个始末. 我就说说我的解决方法吧. 进入 启动修复 的 命令提示符(最好是使用有管理员权限的,不过普通用户我也每试过), 使用 bcdedit 命令来查看. 可以查看到你的启动参数. 确认 truncatememory 是否为 0x10000000(我的是这个). 然后执行下面的命令 bcdedit /deletevalue {default} tr

Unity3D占用内存太大的解决方法

最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时 动态加载,可以指定路径和来源的. 其实场景里所有静态的对象也有这么一个加载过程,只是Unity3D后台替你

有关tomcat内存溢出的完美解决方法_java

tomcat内存溢出设置JAVA_OPTS 答案1 设置Tomcat启动的初始内存 其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4.可以利用JVM提供的-Xmn -Xms -Xmx等选项可 进行设置 三.实例,以下给出1G内存环境下java jvm 的参数设置参考: JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -D

电脑提示内存不能为read怎么解决?内存不能为read解决方法

使用软件时提示如下 原因分析 内存或虚拟内存地址使用抵触造成.  顺序的运行需要分配一定的内存地址给程序使用,当顺序结束时释放留出空间让给新的顺序使用, win是 多任务的系统, 有时前程序未结束 ,又有新的任务开始 .到底要多少内存或虚拟内存来保证我同时运行的工作任务呢 ? 也许 win 这个问题上没弄好,所以有此错误常常发生,一般运行大型软件或多媒体后出现这种情况. 解决此问题办法 1.很多时候由于系统和显卡驱动的兼容性不好,也会出现这样的错误,建议你换个其他版本的显卡驱动安装,或换个其他版

Tomcat内存溢出分析及解决方法_java

JVM管理两种类型的内存,堆和非堆.堆是给开发人员用的上面说的就是,是在JVM启动时创建:非堆是留给JVM自己用的,用来存放类的信息的.它和堆不同,运行期内GC不会释放空间. 一.内存溢出类型 1.java.lang.OutOfMemoryError: PermGen space JVM管理两种类型的内存,堆和非堆.堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的.它和堆不同,运行期内GC不会释放空间.如果web app用了大量的第三方jar或者

Java中典型的内存泄露问题和解决方法_java

Q:在Java中怎么可以产生内存泄露?A:Java中,造成内存泄露的原因有很多种.典型的例子是一个没有实现hasCode和equals方法的Key类在HashMap中保存的情况.最后会生成很多重复的对象.所有的内存泄露最后都会抛出OutOfMemoryError异常,下面通过一段简短的通过无限循环模拟内存泄露的例子说明一下. 复制代码 代码如下: import java.util.HashMap;import java.util.Map; public class MemoryLeak {  p

php提示 内存位置访问无效 解决方法总结

新配置的PHP环境,或者刚做过配置改动,比如新加载的DLL扩展,访问页面,可能会出现"内存位置访问无效."的错误.主要原因是DLL扩展加载失败. 我们就需要找到是哪一个DLL文件加载出现了问题.排查方法是: 将php.ini中  代码如下 复制代码 display_startup_errors = Off 改为 display_startup_errors = On . 这时访问php页面,服务器上会弹出php错误的提示对话框,你就可以明确看到是哪一个dll文件加载失败,有时会有多个d

php内存不够用的解决方法

  再运行php程序时,会出现 Allowed memory size of 8388608 bytes exhausted (tried to allocate 1298358 bytes) 出现该错误的原因:在确保不是程序产生的原因(例如死循环),是由于php页面消耗的最大内存默认是为 8M (在PHP的ini件里可以看到) , 如果文件太大 或图片太大 在读取的时候 会发生上述错误. 解决办法: 1,修改 php.ini将memory_limit由 8M 改成 16M(或更大),重启apa