小编ath*_*e0z的帖子

QSharedPointer和QObject :: deleteLater

我有一种情况,QSharedPointer托管对象发出信号表明它已经完成了它的目的,并且很快就准备好删除了(执行后离开函数发出我的readyForDeletion信号).使用普通指针时,我只是调用QObject::deleteLater该对象,但是对于一个QSharedPointer管理实例来说这是不可能的.我的解决方法如下:

template<typename T>
class QSharedPointerContainer : public QObject
{
   QSharedPointer<T> m_pSharedObj;

public:

   QSharedPointerContainer(QSharedPointer<T> pSharedObj)
      : m_pSharedObj(pSharedObj)
   {} // ==> ctor

}; // ==> QSharedPointerContainer

template<typename T>
void deleteSharedPointerLater(QSharedPointer<T> pSharedObj)
{
   (new QSharedPointerContainer<T>(pSharedObj))->deleteLater();
} // ==> deleteSharedPointerLater
Run Code Online (Sandbox Code Playgroud)

这很好用,但是使用这种方法有很多开销(分配一个新的QObject等等).有没有更好的解决方案来处理这种情况?

c++ qt shared-ptr qobject qsharedpointer

8
推荐指数
1
解决办法
4236
查看次数

stn :: string的strncpy等价物?

是否有一个确切相当于strncpy()函数的C++标准库中?我的意思是一个函数,它将一个字符串从一个缓冲区复制到另一个缓冲区,直到它到达终止0?例如,当我必须从不安全的源解析字符串时,例如TCP数据包,所以我能够在处理数据时执行长度检查.

我已经搜索了很多关于这个主题的内容,我也发现了一些有趣的话题,但所有这些人都对std :: string :: assign感到满意,它也可以将一个字符大小复制为参数.我对这个函数的问题是,它不会执行任何检查,如果已经命中了终止空值 - 它需要给定的大小严重并且像memcpy一样复制数据到字符串的缓冲区中.这样,如果在应对时有这样的检查,则分配和复制的内存比必须完成的内存多得多. 

这就是我目前正在解决这个问题的方式,但是我希望避免一些开销:

    // Get RVA of export name
    const ExportDirectory_t *pED = (const ExportDirectory_t*)rva2ptr(exportRVA);
    sSRA nameSra = rva2sra(pED->Name);

    // Copy it into my buffer
    char *szExportName = new char[nameSra.numBytesToSectionsEnd];
    strncpy(szExportName, 
            nameSra.pSection->pRawData->constPtr<char>(nameSra.offset),
            nameSra.numBytesToSectionsEnd);
    szExportName[nameSra.numBytesToSectionsEnd - 1] = 0;

    m_exportName = szExportName;
    delete [] szExportName;
Run Code Online (Sandbox Code Playgroud)

这段代码是我的PE-binaries解析器的一部分(准确地解析导出表的例程).rva2sra将相对虚拟地址转换为PE节相对地址.该ExportDirectory_t结构包含RVA二进制,其中出口名称应该是零结尾的字符串.但事情并非总是如此 - 如果有人想要它,它将能够省略终止零,这将使我的程序运行到不属于该部分的内存中,它最终会崩溃(在最好的情况下...).

我自己实现这样的功能不是一个大问题,但如果在C++标准库中实现了这个解决方案,我更喜欢它.

c++ string strncpy

7
推荐指数
1
解决办法
5676
查看次数

标签 统计

c++ ×2

qobject ×1

qsharedpointer ×1

qt ×1

shared-ptr ×1

string ×1

strncpy ×1