首页 > 编程知识 正文

java支持鲁棒性指针,linux内核修改pc指针

时间:2023-05-05 13:45:20 阅读:44282 作者:4581

1、智能指针本质上是对象,可以像本地人一样使用。 这是因为,在与智能指针的对象对应的类中,指针相关的操作都被进行了重载操作处理,所以能够得到这样的本机效果。

2、智能指针的含义:

当前c开发库中最重要的类模板之一

c中自动内存管理的主要手段

能够大幅避免存储器相关问题

3、QT在开发库中也提供了智能指针类模板。 STL标准库也提供了。 c的标准库中忘记了几个人,但也提供了智能指针类模板。 所以,智能指针类模板在c中的地位很重要

4、STL的智能指针类模板auto_ptr位于名为memory的头文件中。

(1)生命周期结束时,废弃积分的内存区域

)不能指向堆数组,只能指向堆对象(变量)

)3)一个堆区域只属于一个智能指针的对象

)4)多个智能指针的对象不能指向同一堆区域

因为auto_ptr是类模板,所以要指定和使用类型参数。 例如a:auto_ptrpt(newtest ) ); pt.get (; 可以返回pt所指区域的存储器起始地址。

5、STL的其他智能指针

)1) shared_ptr:具有引用计数机制,以支持多个指针对象指向同一存储器空间

)2) weak_ptr )与shared_ptr相匹配的有吸引力的智能指针

)3) unique_ptr个指针对象只能指向一个内存空间,但不能转移所有权,不能复制和赋值结构。

示例:使用STL标准库auto_ptr

#包含

#包含

名为#include //auto_ptr的智能指针模板位于此头文件中

用户命名空间STD;

/*

*使用STL标准库的auto_ptr智能指针模板。

*auto_ptr的特点:

*生命周期结束后,销毁指定的内存空间

*不能指向堆数组。 只能指向堆对象(变量)

*一个堆空间属于一个智能指针对象

*多个智能指针上的对象不能指向同一堆区域

*/

类测试

{

隐私:

string m_name;

公共:

测试(常数字符名称) ) )。

{

m_name=name;

cout 'Hello.' 'I'm ' name endl;

}

void打印() )

{

cout'why_fangqing'endl;

}

~Test () )

{

cout 'Goodbye ' m_name endl;

}

(;

输入主(语音) )。

{

auto_ptrpt1(newtest ) ' why ' );

cout 'pt1=' pt1.get () endl; //取得指示存储器空间的起始地址

pt1-print (;

auto_ptrpt2(pt1; //pt2指向pt1指定的存储空间,pt1释放指定的存储空间。 这是auto_ptr的特征,一个存储器空间只能由一个auto_ptr指针对象来指向

cout 'pt1=' pt1.get () endl; //0

cout 'pt2=' pt2.get () endl;

pt2-print (;

返回0;

}

6、Qt中的智能指针类模板

)1)只要在QPointer、Qt中包含QPointer头文件,就可以使用该QPointer智能指针类模板

@1:如果放弃指向的对象,它将自动为空。 (也就是说,如果多个QPointer智能指针可以指向同一对象,并且该对象被销毁,指向该对象的所有QPointer指针都将为空。)

@2)对于析构函数,不会自动销毁指向的对象。 (也就是说,当QPoniter指针的生命周期结束时,指向的对象(堆空间)不会自动删除。 我们手动删除。 手动删除后,所有指向此堆

空间中的所有QPointer指针都将为空)

)2)在QSharedPointer、Qt的QSharedPointer头文件中。

@1:引用计数型智能指针

@2:自由复制和

赋值

@3:当引用计数为0时才删除指向的对象(也就是,当这个对象被一次QSharedPointer指针指向时,就会加一次这个对象的引用的次数。当指向这个对象的QSharedPointer指针少一个时,

就会减一次这个对象的引用次数,直到减到没有一个QSharedPointer指针指向这个对象时,也就是这个对象被QSharedPointer指针引用次数为0时,才会销毁这个对象)

在Qt开发中,所有自己写的类,都要去继承QObject这个顶层父类,也就是基类。

7、Qt中的其他智能指针类模板

(1)QWeakPointer

(2)QScopedPointer

(3)QSharedDataPointer

(4)QExplicitlySharedDataPointer

例:

#include

#include

#include

#include

/*

*Qt开发库中的QPointer智能指针和QSharedPo智能指针类模板的使用。

*QPointer的特点:

*@1:当其指向的对象被销毁时,它会被自动置空。

*  (也就是说可以多个QPointer智能指针指向同一个对象,当这个对象被销毁的时候,所有的指向这个对象的QPointer指针都变为空了)

*@2:析构时不会自动销毁所指向的对象。(也就是说QPoniter指针生命周期结束的时候,

*不会自动删除所指向的对象(堆空间),我们要手动的delete掉,手动delete一次之后,所有指向这个堆空间的QPointer指针都会被置为空)

*/

/*

*   QSharedPointer的特点:

*   @1:引用计数型智能指针

*   @2:可以被自由的拷贝和赋值

*   @3:当引用计数为0时才删除指向的对象(也就是,当这个对象被一次QSharedPointer指针指向时,就会加一次这个

*   对象的引用的次数。当指向这个对象的QSharedPointer指针少一个时,就会减一次这个对象的引用次数,

*   直到减到没有一个QSharedPointer指针指向这个对象时,也就是这个对象被QSharedPointer指针引用次数为0时,才会销毁这个对象)

*/

class Test : public QObject //Qt中所有自己完成的类都要继承这个Qt中的QObject顶层父类,基类

{

private:

QString m_name;

public:

Test(const char *name)

{

m_name = name;

qDebug() << "Hello." << "I'm " << name;

}

void print()

{

qDebug() << "why_fangqingqing ";

}

~Test()

{

qDebug() << "Goodbye " << m_name;

}

};

int main(void)

{

QPointer pt1(new Test("why"));

QPointer pt2(pt1);

qDebug() << "pt1 = " << pt1;

qDebug() << "pt2 = " << pt2;

pt1->print();

pt2->print();

delete pt1; //要手动的去delete掉pt1所指向的堆空间。编译器不会自动的去销毁,当生命周期结束时,delete掉后,所有指向这个空间

//的QPointer指针都会被置为空。

qDebug() << "pt1 = " << pt1;    //0

qDebug() << "pt2 = " << pt2;    //0

qDebug() << endl;

QSharedPointer spt1(new Test("fangqingqing"));    //这时这个堆空间的对象被QSharedPoin引用了一次

QSharedPointer spt2(spt1);    //这时这个堆空间的对象被QSharedPoin引用又加了一次

qDebug() << "spt1 = " << spt1;

qDebug() << "spt2 = " << spt2;

spt1->print();

spt2->print();

return 0;       //当那个堆空间的对象被QSharedPointer引用的次数减到0时,就会销毁这个堆空间的对象

}

7、自己实现一个智能指针类模板

#ifndef _SMARTPOINTER_H_

#define _SMARTPOINTER_H_

template

< typename T >

class Pointer

{

private:

T *mp;

public:

Pointer(T* p = NULL)

{

mp = p;

}

Pointer(const Pointer& obj)

{

mp = obj.mp;

const_cast&>(obj).mp =NULL;

}

Pointer& operator = (const Pointer& obj)

{

if (this != &obj)

{

delete mp;

mp = obj.mp;

const_cast&>(obj).mp = NULL;

}

return *this;

}

T* get()

{

return mp;

}

T* operator -> ()

{

return mp;

}

T& operator * ()

{

return *mp;

}

~Pointer()

{

delete mp;

}

bool isNULL()

{

return (mp == NULL);

}

};

#endif

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。