想到了一个比较简单的方法,一个野指针/悬垂指针指向的内存区域可能无效可能未知,但是这个指针仍然会被当作指针所指的对象解析。
那么可以定义一个基类,并让需要判断的类继承他。基类中包含一个私有长整型数,在构造函数里赋给一个特定数值(这个特定值应当不容易与内存中的不确定的数据重复,一般来说重复的概率也有一千八亿亿分之一了),析构函数中将该值置零。
那么如果一个继承自该类的指针直接判断该整数是否等于特定值即可。
测试代码如下:
#include "stdafx.h"
#include <iostream>
using namespace std;
class Ptr
public:
Ptr()
:value(0x123456789ABCDE0)
cout << "constructor:" << value << endl;
~Ptr()
value = 0;
cout << "destructor:" << value << endl;
bool isWildPointer() { return value != 0x123456789ABCDE0; }
private:
long long value;
int main()
Ptr* a = new Ptr();
cout << "a:" << a << " isWildPointer:" << a->isWildPointer() << endl;
//输出为 a:00D8E4B0 isWildPointer:0
delete a;
cout << "a:" << a << " isWildPointer:" << a->isWildPointer() << endl;
//输出为 a:00D8E4B0 isWildPointer:1
return 0;
inline void checked_delete(T* x) noexcept
typedef char type_must_be_complete[sizeof(T) ? 1 : -1];
(void) sizeof(type_must.
//把 p1 指针的值拷贝到 pArray[0]
memmove(&pArray[0], &p1, sizeof(p1));
//输出:address: 000001F49D79B1F0 value : 255,正常
1)指针的引用作为函数参数,当实参指针被设置NULL,函数内部可以使用NULL来判断。1)将一个指针赋值给另一个指针,也就是智能指针作为函数参数时候,引用计数会增加。当调用shared_ptr.reset()时候,并不会导致形参被设置NULL。1.使用智能指针shared_ptr。
刚学C++的朋友,要数最令人头疼的问题莫过于指针了。
当你在堆上创建了一个对象时,系统就把这个对象的生命期完全交给了你,当用完之后,系统并不会回收资源,而是需要你来释放它。
那么,既然要负责对象的释放问题,就要知道什么时候释放和在哪里释放。如果你没有处理好这两个问题,就会造成内存泄漏或程序崩溃的问题。
//1 内存泄漏 str1所指的资源没有被释放
Classes 根据是否包含指针成员(指向动态内存(堆内存))可以分为: Class without pointer member(s): complexclass complex{public: complex (double r = 0, double i = 0): re (r), im (i) { } complex& operator += (const comple...
21. 智能指针
智能指针:C++内存管理是一个令人很头疼的事情,尽管每次写完new都会写一个delete,但是如果程序还没有执行到delete的时候就跳转了或者函数返回了
野指针:
野指针不同于空指针,空指针是指一个指针的值为null,而野指针的值并不为null,野指针会指向一段实际的内存,只是它指向哪里我们并不知情,或者是它所指向的内存空间已经被释放,所以在实际使用的过程中,我们并不能通过指针判空去识别一个指针是否为野指针。避免野指针只能靠我们自己养成良好的编程习惯,下面说说哪些情况下会产生野指针,以及怎样避免。
1. 指针变量的值未被初始化:...
在C++中,动态内存的申请和释放是通过运算符:new 和 delete 进行管理的。其中 new 负责申请内存,delete负责释放内存。动态内存的使用很容易出现问题,这主要在于你需要保证在正确的时间释放内存,这是比较困难的,如果你忘记释放内存,就会造成内存泄露;有时在还有指针引用内存的情况下我们就释放了它,在这种情况下就会产生引用非法内存的指针。