您尚未登录。

#1 Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 嵌入式开发有什么办法检查内存泄漏 » 2017-09-13 08:35:38

cyxstrong
回复: 0

二次封装内存申请和释放的函数,记住申请的内存块和释放的内存块,打印检查进入和退出每个应用时的内存空间,检查是哪个应用导致内存泄漏,逐步向下定位到应用内

#2 Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 一个vc工程文件需要配置哪些项? » 2017-09-11 09:13:33

cyxstrong
回复: 0

右键点击属性,打开工程属性页,

1. 在配置属性的常规目录中,填入输出目录。


2. 在配置属性的常规目录中,选择字符集。

3. 在配置属性-》调试 的工作目录中,填入工作目录的路径。

4. 选中配置属性的c/c++ 项,在预处理器中填入开关宏定义。

5. 选中配置属性的c/c++ 项,在右边附加包含目录中 填入绝对路径或者相对路径。

6. 选中配置属性的连接器,在附加库目录中填入库路径。

#3 Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 智能指针shared_ptr的用法 » 2017-09-08 21:39:40

cyxstrong
回复: 0

shared_ptr是一个最像指针的"智能指针",是boost.smart_ptr库中最有价值、最重要的组成部分,也是最有用的,Boost库的许多组件--甚至还包括其他一些领域的智能指针都使用了shared_ptr。
      shared_ptr的作用有如内指针,但会记录有多少个tr1::shared_ptrs共同指向一个对象。这便是所谓的引用计数(reference counting)。一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除。
     
1.  shared_ptr的线程安全性
       shared_ptr 本身不是 100% 线程安全的。它的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档,shared_ptr 的线程安全级别和内建类型、标准库容器、string 一样,即:
一个 shared_ptr 实体可被多个线程同时读取;
两个的 shared_ptr 实体可以被两个线程同时写入,“析构”算写操作;
如果要从多个线程读写同一个 shared_ptr 对象,那么需要加锁。

2.  shared_ptr用法
#include <iostream>
#include <tr1/memory>
class Foo
{
public:
void print()
{
std::cout << " foo::print" << std::endl;
}
};

int main()
{
std::tr1::shared_ptr<Foo> sp1(new Foo);
sp1->print();
std::cout << "sp1 pointer: " << sp1.get() << std::endl;
std::tr1::shared_ptr<Foo> sp2(sp1);
sp2->print();
std::cout << "sp1 pointer: " << sp1.get() << std::endl;
std::cout << "sp2 pointer: " << sp2.get() << std::endl;
std::cout << "counter sp1: " << sp1.use_count() << std::endl;
std::cout << "counter sp2: " << sp2.use_count() << std::endl;
return 0;
}
/
/* SP2创建后, SP1增加引用计数.
*    指向的对象超出范围时,最后一个销毁的指针会释放资源
*
* 例子输出:
* foo::print
* sp1 pointer: 0x90a7008
* foo::print
* sp1 pointer: 0x90a7008
* sp2 pointer: 0x90a7008
* counter sp1: 2
* counter sp2: 2
*/

#4 Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » std::unique_lock 有什么用 » 2017-09-07 19:21:30

cyxstrong
回复: 1

C++11 标准中定义了的该类与 lock_guard 类相似,也很方便线程对互斥量上锁,但它提供了更好的上锁和解锁控制。

顾名思义,unique_lock 对象以独占所有权的方式( unique owership)管理 mutex 对象的上锁和解锁操作,所谓独占所有权,就是没有其他的 unique_lock 对象同时拥有某个 mutex 对象的所有权。

在构造(或移动(move)赋值)时,unique_lock 对象需要传递一个 Mutex 对象作为它的参数,新创建的 unique_lock 对象负责传入的 Mutex 对象的上锁和解锁操作。

std::unique_lock 对象也能保证在其自身析构时它所管理的 Mutex 对象能够被正确地解锁(即使没有显式地调用 unlock 函数)。因此,和 lock_guard 一样,这也是一种简单而又安全的上锁和解锁方式,尤其是在程序抛出异常后先前已被上锁的 Mutex 对象可以正确进行解锁操作,极大地简化了程序员编写与 Mutex 相关的异常处理代码。

值得注意的是,unique_lock 对象同样也不负责管理 Mutex 对象的生命周期,unique_lock 对象只是简化了 Mutex 对象的上锁和解锁操作,方便线程对互斥量上锁,即在某个 unique_lock 对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而 unique_lock 的生命周期结束之后,它所管理的锁对象会被解锁,这一点和 lock_guard 类似,但 unique_lock 给程序员提供了更多的自由,我会在下面的内容中给大家介绍 unique_lock 的用法。

另外,与 lock_guard 一样,模板参数 Mutex 代表互斥量类型,例如 std::mutex 类型,它应该是一个基本的 BasicLockable 类型,标准库中定义几种基本的 BasicLockable 类型,分别 std::mutex, std::recursive_mutex, std::timed_mutex,std::recursive_timed_mutex (以上四种类型均已在上一篇博客中介绍)以及 std::unique_lock(本文后续会介绍 std::unique_lock)。

#5 Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » std::lock_guard有什么用 » 2017-09-07 19:12:33

cyxstrong
回复: 1

std::lock_gurad 是 C++11 中定义的模板类。定义如下:

template <class Mutex> class lock_guard;
lock_guard 对象通常用于管理某个锁(Lock)对象,因此与 Mutex RAII 相关,方便线程对互斥量上锁,即在某个 lock_guard 对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而 lock_guard 的生命周期结束之后,它所管理的锁对象会被解锁(注:类似 shared_ptr 等智能指针管理动态分配的内存资源 )。

模板参数 Mutex 代表互斥量类型,例如 std::mutex 类型。标准库中定义几种基本的 BasicLockable 类型,分别 std::mutex, std::recursive_mutex, std::timed_mutex,std::recursive_timed_mutex 以及 std::unique_lock。

在 lock_guard 对象构造时,传入的 Mutex 对象(即它所管理的 Mutex 对象)会被当前线程锁住。在lock_guard 对象被析构时,它所管理的 Mutex 对象会自动解锁,由于不需要程序员手动调用 lock 和 unlock 对 Mutex 进行上锁和解锁操作,因此这也是最简单安全的上锁和解锁方式,尤其是在程序抛出异常后先前已被上锁的 Mutex 对象可以正确进行解锁操作,极大地简化了程序员编写与 Mutex 相关的异常处理代码。

值得注意的是,lock_guard 对象并不负责管理 Mutex 对象的生命周期,lock_guard 对象只是简化了 Mutex 对象的上锁和解锁操作,方便线程对互斥量上锁,即在某个 lock_guard 对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而 lock_guard 的生命周期结束之后,它所管理的锁对象会被解锁。

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn