当前位置: 首页 > news >正文

东莞网站建设设计价格无锡网站制作哪些

东莞网站建设设计价格,无锡网站制作哪些,网站全站出售,无极在线网以下代码中你能看出其存在什么问题&#xff1f;如何修复&#xff0c;能给出几种方法&#xff1f;分别在什么场景下用哪种方法。 #include <iostream>class Buffer {public:Buffer() { std::cout << "Buffer created" << std::endl; }~Buffer() { s…

以下代码中你能看出其存在什么问题?如何修复,能给出几种方法?分别在什么场景下用哪种方法。

#include <iostream>class Buffer {public:Buffer() { std::cout << "Buffer created" << std::endl; }~Buffer() { std::cout << "Buffer destroyed" << std::endl; }Buffer(const Buffer&) = delete;Buffer& operator=(const Buffer&) = delete;
};class BufferManager {public:BufferManager() : buffer(new Buffer()) {std::cout << "BufferManager created" << std::endl;}~BufferManager() {std::cout << "BufferManager destroyed" << std::endl;delete buffer;}private:Buffer* buffer;
};void getBuffer(BufferManager manager) {std::cout << "Call getBuffer" << std::endl;
}int main() {BufferManager manager;getBuffer(manager);return 0;
}

代码简单介绍如下:给出两个类,一个是 buffer 管理器,底层是 buffer, buffer 管理器持有一个 buffer 指针,有一个 getBuffer 函数。主逻辑也很简单,就是构造 BufferManager,调用 getBuffer

我们简单分析一下代码:

我们在 getBuffer 中,是按值传递 BufferManager 对象,这会导致 BufferManager 对象被拷贝。然而, BufferManager 对象中报一个只想动态分配内存的 buffer ,并且 BufferManager 的默认拷贝构造函数只是执行浅拷贝。这样,多个 BufferManager 对象会共享同一个 Buffer 对象指针。当它们被销毁时,析构函数会多次尝试删除同一个指针,导致双重释放错误。

拷贝构造函数和赋值运算符的隐式生成会默认浅拷贝!!这对于类中包含指针成员时,通常会导致资源管理问题。

方案一:禁止拷贝构造和赋值操作

主要场景: 如果 BufferManager 作为资源的唯一拥有者,不应允许拷贝,则可以直接禁止拷贝构造函数和赋值操作符。这样就可以避免拷贝行为带来的问题。

class BufferManager {public:BufferManager() : buffer(new Buffer()) {std::cout << "BufferManager created" << std::endl;}~BufferManager() {std::cout << "BufferManager destroyed" << std::endl;delete buffer;}// 禁止拷贝构造和赋值操作BufferManager(const BufferManager&) = delete;BufferManager& operator=(const BufferManager&) = delete;private:Buffer* buffer;
};

通过禁止拷贝和赋值操作,BufferManager 对象无法被复制,因此也不会出现指针重复管理的问题。在需要确保对象不可拷贝的场景下使用这种方法非常合适,例如管理独占资源时。

方式二:按引用传递 BufferManager(最普遍、广泛的改进)

场景:如果只需要传递 BufferManager 的引用,而不需要拷贝整个对象,可以使用按引用传递的方式。这可以避免对象的拷贝,消除双重释放的风险

void getBuffer(BufferManager& manager) {}

方式三:使用智能指针(也是一种普遍、广泛的改进)

场景:如果希望让对象能够被安全地复制和转移,并且自动管理指针的生命周期,可以使用 std::unique_ptr 代替原始指针。std::unique_ptr 能够确保指针只被释放一次,并且不会导致双重释放问题。

我们将 BufferManager 中的原始指针替换为 std::unique_ptr,这样当 BufferManager 被销毁时,智能指针会自动管理 Buffer 对象的销毁。

#include <memory>class BufferManager {public:BufferManager() : buffer(std::make_unique<Buffer>()) {std::cout << "BufferManager created" << std::endl;}~BufferManager() {std::cout << "BufferManager destroyed" << std::endl;}private:std::unique_ptr<Buffer> buffer;
};
http://www.yayakq.cn/news/293486/

相关文章:

  • 深圳需要做网站的公司有哪些网站建设规范管理工作
  • 在线旅游网站平台有哪些wordpress怎样弄栏目
  • 有口碑的番禺网站建设西宁网站建设最好的公司
  • 易烊千玺个人网站入口有区域名和主机怎么做网站
  • 网站络国外活动策划网站
  • 国内网站有哪些遵义网站建设公司有哪些
  • 网站建设工资一月多少网站内容结构
  • 杭州城西做网站的公司开网店卖什么好
  • 网站开发 pptqq怎么做自己的网站
  • 用ps软件做ppt模板下载网站有哪些网站维护哪些
  • 建设高端网站公司的目的一个新网站关键词怎么做SEO优化
  • 门户网站营销常用的网络推广方式有哪些
  • 网站开发维护前景制作手机广告的网站
  • 鞍山58同城官网莆田百度快照优化
  • 亳州建设网站公司东莞长安网红打卡地
  • 公众号里链接的网站怎么做的wordpress站群是什么
  • 什么网站时候做伪静态上海网站建设公司兴田德润放心
  • 晋城市建设局 网站陕西网页制作
  • 网站推广优化外包html模板网
  • 做药物分析必须知道的网站公司查询
  • 企业网站建设背景企业门户中的基本信息包括
  • 班级网站怎样做网站优化就是每天更新内容吗
  • 网站怎么做动态切图网站建设销售求职
  • 网站推广的内涵杭州俄语网站建设
  • wordpress插件不兼容深圳最好的seo培训
  • 商务网站建设组成包括网站优化上海招聘网最新招聘
  • 雄安智能网站建设电话服务器服务器租用
  • 全flash网站下载widget earth wordpress
  • 化妆品行业的网站开发百度推广后台管理
  • 做外贸的要有自己的网站吗wordpress给分类做模板