C++ 智能指针在什么时候使用

C++ 智能指针在什么时候使用,第1张

所属头文件:#include <memory>

所属命名空间及标识符:using std::shared_ptr

所属版本:C++98

g++启用版本命令:g++ -std=c++98 -c -o

补充:

如果启用c++11及以上标准,即g++ -std=c++11 -c -o,编译时会有一个警告信息提示

warning:‘auto_ptr’ is deprecated (‘auto_ptr‘被反对使用)

存在很多种智能指针,其中最有名的应该是C++98标准中的“自动指针”std::auto_ptr,它部分解决了获取资源自动释放的问题,例如:

#include <memory>

#include <iostream>

#include <string>

using std::cin

using std::cout

using std::string

using std::auto_ptr

class Report

{

private:

std::string str

public:

Report( const string s ):str(s) { cout <<"Object created!\n"}

~Report() { cout <<"Object deleted!\n"}

void comment(string owner) const { cout <<owner <<str <<"\n"}

}

int main(void)

{

auto_ptr<Report>ps (new Report("Using auto_ptr."))

ps->comment(string("ps:"))

auto_ptr<Report>p1

p1 = ps //赋值完毕后ps已经失去对内存对象的所有权,不可再使用

p1->comment(string("p1:"))

//ps->comment(string("after p1=ps:")) //error,Segmentation faul

}

/*Result:

Object created!

Using auto_ptr.

Object deleted!

*/

auto_ptr的构造函数接受new *** 作符或者对象工厂创建出的对象指针作为参数,从而代理了原始指针。虽然它是一个对象,但因为重载了 operator*后operator->,其行为非常类似指针,可以把它用在大多数普通指针可用的地方。当退出作用域时(离开作用域或异 常),C++会保证auto_ptr对象销毁,调用auto_ptr的析构函数,进而使用delete *** 作符删除原始指针释放资源。

auto_ptr很好用,被包含在C++标准库中令它在世界范围内被广泛使用,使用智能指针的思想、用法深入人心。但标注库没有覆盖智能指针的全部领域,尤其最重要的引用计数型智能指针。

在stdafx.h中添加如下语句饮用ADO智能指针

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \

rename_namespace("ADOCG") rename("EOF", "EndOfFile") rename("BOF", "BeginOfFile")

using namespace ADOCG

否则编译器认为ADO智能指针未定义

filebuf::openprot //默认的兼容共享方式

filebuf::sh_none  //独占,不共享

filebuf::sh_read  //读共享

filebuf::sh_write //写共享

以上方式仅旧版VC中支持,新版VC在share.h中为Win32项目定义了如下方式

_SH_DENYRW 0x10 /* deny read/write mode*/

_SH_DENYWR 0x20 /* deny write mode */

_SH_DENYRD 0x30 /* deny read mode */

_SH_DENYNO 0x40 /* deny none mode */

_SH_SECURE 0x80 /* secure mode */

示例:fstream a_file(test.dat, ios::in | ios::binary, _SH_DENYRW)

此时使用其他程序打开test.dat将显示“此文件已被其他进程占用”


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11816688.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存