首页 > 编程语言 >C/C++指针无关联,因为它指向已销毁的实例

C/C++指针无关联,因为它指向已销毁的实例

时间:2024-08-13 17:38:47浏览次数:7  
标签:vertexStr 销毁 const C++ char vertexShaderFile 指针

一、概述

  在使用Qt+OpenCV做项目的过程中,发现一个问题。

指针无关联,因为它指向已销毁的实例

  产生这个问题的代码如下:

const char* GLSquareWindow::readFileToString(QString resPath) {
    QFile vertexShaderFile(resPath);
    if (!vertexShaderFile.open(QIODevice::ReadOnly)) {
        qDebug() << "Cannot open vertex shader file for reading";
    }
    QString qStr = vertexShaderFile.readAll();
    vertexShaderFile.flush();
    vertexShaderFile.close();
    std::string stdStr = qStr.toStdString();
    const char* charStr = stdStr.c_str();
    return charStr;
}

  上述代码想要拿到一个const char* 类型的字符数组。

  在其他方法中调用此方法,返回的字符数组是乱码。(浮空指针)

二、解决办法

  方法1:

  ps:我现在用的

  不用这个封装方法,哪里用到就在那里调用。且是分步调用。

QFile vertexShaderFile(":/QtForOpenCV4Tool/shader/square.vert");
if (!vertexShaderFile.open(QIODevice::ReadOnly)) {
    qDebug() << "Cannot open vertex shader file for reading";
}
QString verQStr = vertexShaderFile.readAll();
std::string verStdStr = verQStr.toStdString();
const char* vertexStr = verStdStr.c_str();
//const char* vertexStr = readFileToString(":/QtForOpenCV4Tool/shader/square.vert");
qDebug() << "vertexStr-------------" << vertexStr;

  方法2:

    还是封装方法,把最后一步

const char* vertexStr = verStdStr.c_str();

  自己手动开辟一块内存,存储,使用后可以销毁。

  ps:思路是可行了,我做了验证,数据是出来了,但是后面会填充空字符或空格。如果业务不需要精确可以使用。如果业务上必须和文件中的一致则慎用。

  

标签:vertexStr,销毁,const,C++,char,vertexShaderFile,指针
From: https://www.cnblogs.com/tony-yang-flutter/p/18357422

相关文章

  • 详解C++的四大特性(封装,继承,多态,抽象)
    C++的四大特性是面向对象编程(OOP)的核心概念,分别是封装、继承、多态和抽象。这些特性共同构成了C++作为面向对象编程语言的基础。1.封装(Encapsulation)概念:封装是将数据和操作数据的方法绑定在一起,限制对数据的直接访问。通过将数据隐藏在类内部,只暴露必要的接口(如public成......
  • C++面试
    1.讲一讲封装、继承、多态是什么?封装:将具体实现过程和数据封装成一个类,只能通过接口进行访问,降低耦合性,使类成为一个具有内部数据的自我隐藏能力、功能独立的软件模块。意义:保护或防止代码在无意之中被破坏,保护类中的成员,不让类中以外的程序直接访问或者修改,只能通过提供的公共接......
  • C++静态函数
    由于本人C++小白,关于C++的很多基础概念都不太理解,在工作当中遇到了静态函数,在函数的使用和调用外部函数与普通函数还是非常不一样的,故这里向AI请教,简单做个记录。AI的回答内容如下:Yousaid:C++当中静态函数的优势是什么ChatGPTsaid:在C++中,静态函数(static函数)是指通过在函......
  • 【C++ STL分配器】详细介绍
    C++中的分配器(Allocator)是用于抽象和管理内存分配与释放的机制,主要用于标准模板库(STL)容器。分配器的设计允许开发者自定义内存管理策略,从而优化性能、满足特殊需求或实现特定功能(如内存池、共享内存等)。本文将详细介绍C++分配器的概念、作用、自定义分配器的实现以及......
  • /lib64/libstdc++.so.6: version GLIBCXX_3.4.20 not found
    java应用运行出现了2个错误,error1:/lib64/libstdc++.so.6:versionGLIBCXX_3.4.20notfounderror2:/lib64/libstdc++.so.6:versionCXXABI_1.3.8notfound查阅了网上的解决方法,都说要更新libstdc++.so.6,按照教程操作,一直没有成功,最后参考了好几篇文章,综合了大家的方法,成功更新......
  • c++通讯录管理系统
    1、系统需求(1)添加。添加联系人信息(主要包括姓名、年龄、号码和备注)。(2)遍历。显示出所有联系人的信息。(3)删除。删除指定的联系人信息,通过电话号码筛选。(4)修改。修改指定的联系人信息,通过电话号码查找。(5)查找。查找指定的联系人信息,通过电话号码查找。(6)清空。清空所有联系......
  • c语言-指针详解
    一指针变量1.1指针的概念本质上指针就是地址,我们所说的指针就是指针变量,指针变量是一个用来存放地址的指针。我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,那我们电脑上内存是8GB/16GB/32GB等,那这些内存空......
  • 高性能的 C++ Web 开发框架 CPPCMS + WebSocket 模拟实现聊天与文件传输案例。
    1.项目结构2.config.json{"service":{"api":"http","port":8080,"ip":"0.0.0.0"},"http":{"script":"",&q......
  • C++浅拷贝和深拷贝
    在C++编程中,对象的拷贝是一项常见的操作。深拷贝和浅拷贝是两种常用的拷贝方式,对于理解对象拷贝的内部机制和避免潜在的问题至关重要。本文将深入解析C++中的深拷贝和浅拷贝的概念、原理以及使用场景,帮助读者更好地掌握和运用这两种拷贝方式。浅拷贝(ShallowCopy)是指在拷贝对象时......
  • C++——构造函数和析构函数
    一、初识构造函数和析构函数简单来说,有对象生成必然会调用构造函数,有对象销毁必然会调用析构函数。构造函数的作用是初始化成员变量,是由编译器去调用的,而析构函数同理也是由编译器调用,不过他的作用则是清理。可以由下面的代码体验两个函数的使用。注意:相同点:两个函数都没有......