如何推迟shared_ptr的删除操作?

2024-02-01

我创建了一个指针sample主要类。我正在将此指针传递给函数function1()。该函数必须使用指针作为共享指针并使用该指针执行一些操作。退出期间function1()的析构函数sample由于调用shared_ptr。当我将相同的指针传递给不同的函数时,该指针不再有效并且程序崩溃。

1.如何推迟删除操作(销毁调用)function1()?

2.尽管有些函数使用指针作为shared_ptr,但替代方法是什么,以便我可以将指针传递给不同的函数并安全地使用它?

这里我有示例代码和输出。

#include <memory>
#include <iostream>
#include <string.h>

using namespace std;

class sample
{
    private:
        char * data;

    public:
        sample( char * data )
        { 
            cout << __FUNCTION__ << endl;
            this->data = new char[strlen( data)];
            strcpy( this->data, data ); 

        }
        ~sample()
        {
            cout << __FUNCTION__ << endl; 
            delete this->data; 
        }
        void print_data()
        { 
            cout << __FUNCTION__ << endl;
            cout << "data = " << this->data << endl;
        }
};

void function1( sample * ptr )
{
    shared_ptr<sample> samp( ptr );
    /* do something with samp */
    ptr->print_data();
}

void function2( sample * ptr )
{
    ptr->print_data();
}

int main()
{
    char data[10] = "123456789";
    data[10] = '\0';
    sample * s = new sample( data );

    function1( s );
    function2( s );

    return 0;
}

output:

sample
print_data
data = 123456789
~sample
print_data
data = 

Change

sample * s = new sample( data );

into

shared_ptr<sample> s(new sample( data ));

并将共享指针传递给所有函数。当该变量超出范围时它将被删除,对于您的目的来说已经足够晚了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何推迟shared_ptr的删除操作? 的相关文章

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • 如何在最新的.NET Core工具中实现版本自动递增?

    我正在使用最新的 截至今天 NET Core 工具 在那里 您可以在 MSBuild 属性中指定版本 但是 与 assembly AssemblyVersion 不同 这似乎不支持通配符 如何以同样的方式自动增加版本 解释为什么这是一个坏主
  • 基于LSB-DCT的图像隐写术

    我正在研究基于 LSB DCT 的图像隐写术 其中我必须将 LSB 应用于图像的 DCT 系数 以便将数据嵌入到 JPEG 我对这一切都很陌生 所以搜索并阅读了一些研究论文 他们都缺乏很多有关 DCT 之后流程的信息 i 也在 stacko
  • grep - 如何输出进度条或状态

    有时我是grep 处理数千个文件 很高兴看到某种进度 栏或状态 我知道这不是小事 因为grep将搜索结果输出到STDOUT我的默认工作流程是将结果输出到文件中 并希望将进度条 状态输出到STDOUT or STDERR 这是否需要修改源代码
  • 如何获取页面上所有选中复选框的计数

    我想计算用户选择了多少个复选框 例如 从一组 10 个复选框中 如果他选择了 5 个 那么我希望能够对其进行计数 使用线路 checkbox checked 我可以选择所有选中的复选框 是否有办法获取该语句返回的所有元素的计数 Use th
  • fork()返回0,但是子进程getpid()!=0。为什么?

    这是测试 fork 系统调用的 C 代码 include
  • Vue 2 - 改变 props vue-warn

    我已开始https laracasts com series learning vue step by step https laracasts com series learning vue step by step系列 我停课了Vue
  • 为什么 git 无法将“origin/master”识别为有效的对象名称?

    www gt git branch track live origin master fatal Not a valid object name origin master www gt git remote origin www gt g
  • 在 C# 中使用 SQLite 的 Pragma-s

    我发布了一个问题 我的项目有一个 c dll 其中在 Sqllite 中创建了一个数据库 共享拒绝 无 这个 dll 会将数据插入到数据库中 我有一个 c exe 它必须访问数据库并显示它 显示需要异步完成 所以在启动与 sqlitedb
  • 运行测试时导入两次

    我的tests py中有这段代码 from models import 在 models py 中我有一个信号处理程序并将其注册为 post save connect post save note sender Note 当我运行测试时 m
  • 当 tabs + viewpager 位于滚动视图内时,无法加载片段?

    使用材料设计 tablayout viewpager材料设计布局 http blog grafixartist com material design tabs with android design support library 一切都
  • 弹簧支架控制器返回 404

    我的其余控制器是由 spring 编写的 返回 404 但是当我通过 Eclipse 进行调试时 我看到它到达我的方法并返回结果 但结果仍然是 404 控制器就像 RestController RequestMapping admin co
  • PHP Yii:运行时数据库连接

    我想在运行时使用 Yii 连接到第二个数据库 数据库名称将来自用户登录后的数据库表 我在教程中看到我应该这样做 db2 Yii createComponent array class gt EMongoClient server gt mo
  • 如何在 R 中模拟具有同配性或同质性的图?

    In R 我目前正在处理该包igraph 我想知道是否有任何方法可以模拟具有同质或同配结构的图 或者是否有其他方法R软件包允许这样做 谢谢 你有没有看过ergm https cran r project org web packages e
  • 如何检测Android应用程序是否被强制停止或卸载? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 假设应用程序运行良好 但用户强行停止
  • 在Refl中使用重写

    我正在使用 Idris 学习第 8 章类型驱动开发 我有一个关于 rewrite 如何与 Refl 交互的问题 此代码作为重写如何在表达式上工作的示例显示 myReverse Vect n elem gt Vect n elem myRev
  • Java中监听器的顺序

    我编写了自己的表格单元格编辑器 它扩展了AbstractCellEditor并实现了TableCellEditor an ItemListener and a MouseListener 有什么方法可以让我拥有mouseClicked方法先
  • 通过 Eclipse 使用 TestNG 和 Java 12 执行 Selenium 测试时启动层 java.lang.module.FindException 初始化期间发生错误

    引导层初始化期间发生错误 https i stack imgur com pNbsT png当我运行时 我不断收到此错误 我的测试 boot层初始化时出错 java lang module FindException 无法派生模块描述符 C
  • 查找两个语句之间的语义相似性

    我目前正在处理小型应用程序python我的应用程序具有搜索功能 当前使用difflib 但我想创建语义搜索它可以根据用户输入的文本从我的数据库中给出前 5 或 10 个结果 它与谷歌搜索引擎的工作原理相同 我找到了一些解决方案Here ht
  • if-let 语句不会解开可选内容

    我在我的代码中遇到了一些看起来很好奇的东西 并且想知道这种行为是否有一个简单的解释 鉴于以下声明 if let tabBarController topViewController as UITabBarController for sub
  • 如何推迟shared_ptr的删除操作?

    我创建了一个指针sample主要类 我正在将此指针传递给函数function1 该函数必须使用指针作为共享指针并使用该指针执行一些操作 退出期间function1 的析构函数sample由于调用shared ptr 当我将相同的指针传递给不