zoukankan      html  css  js  c++  java
  • c++编程之内存模型

    我们在编程的时候,无可避免要申明变量,在这个变量可以是在()中,可以在{}中,也可以直接在外面,也可以用new的方式.那么当我们在申明变量的时候,实质上我们所做的工作是:关联了一个内存模型

    上代码:

     1 #include <iostream>
     2 #include <thread>
     3 #include <chrono>
     4 #include <mutex>
     5 # include<string>
     6 using namespace std;
     7 mutex mtx;
     8 void fn1()
     9 {
    10     for (int i = 0; i < 5; i++)
    11     {
    12         unique_lock<mutex> lock(mtx);
    13         cout << "线程" << this_thread::get_id() << ":" << "The thread1 is running !" << endl;
    14     }
    15 }
    16 
    17 void fn2()
    18 {
    19     for (int i = 0; i < 5; i++)
    20     {
    21         unique_lock<mutex> lock(mtx);
    22         cout << "线程" << this_thread::get_id() << ":" << "The thread2 is running !" << endl;
    23     }
    24 }
    25 
    26 
    27 class fun{
    28 private:
    29     string name;
    30     int age;
    31 public:
    32     fun(){};
    33     fun(string name, int age)
    34     {
    35         this->name = name;
    36         this->age = age;
    37     }
    38     void ShowName()
    39     {
    40         cout << name << endl;
    41     }
    42     ~fun(){};
    43 };
    44 
    45 int main()
    46 {
    47     thread t1(fn1);
    48     thread t2(fn2);
    49     t1.detach();
    50     t2.detach();
    51 
    52     this_thread::sleep_for(chrono::milliseconds(1000));
    53     fun zhangsan("zhangsan", 5);
    54     fun*lisi = new fun("zhangsan", 5);//动态申请的方式,但是要用到指针
    55     zhangsan.ShowName();
    56     lisi->ShowName();
    57     delete lisi;
    58     //lisi->ShowName();
    59     lisi = nullptr;
    60     getchar();
    61     return 0;
    62 }

    我们分析上面程序中的三个典型变量:zhangsan,lisi(在main函数中的),以及第七行的mtx。

    zhangsan是一个局部变量,存在于栈空间,lisi也是一个局部变量,但是其采用new的方式,则lisi 属于动态内存分配,存在于堆区,而mtx属于全局变量,存在于某一个静态区。

    c++中的典型内存模型为:C++的内存模型 = 静态存储区(全局变量,静态变量)+堆(malloc,new的对象)+栈。

    对于上述一段代码,还应该关注的是:如何使用 new ;new 必须和指针变量相关联!!!   用法是:类型 指针 = new 类型

  • 相关阅读:
    基于openpose的动作识别(一)检测人脸人手
    12.4第三天
    安装linux windows双系统
    python学习之argparse模块
    win10安装linux虚拟机
    使用labelImg训练模型并用yolo3进行识别的工作流程
    使用labelImg标注数据的方法
    VirtualBox网络连接方式
    HttpWebRequest 请求带OAuth2 授权的webapi
    Bootstrap table 分页 In asp.net MVC
  • 原文地址:https://www.cnblogs.com/shaonianpi/p/11439585.html
Copyright © 2011-2022 走看看