unique_ptr的使用



前言

unique_ptr采用独享语义,在任何给定时刻,只能有一个指针管理内存。当指针超出作用域时,内存将自动释放,而且该类型的指针不可copy,只可以move。


一、测试:栈

在使用unique_ptr前,先用类对象对栈内存进行测试。
1.类的头文件声明如下:

#ifndef CAT_H
#define CAT_H
#include<string>
#include<iostream>
class Cat
{
    public:
    Cat(std::string name);
    Cat()=default;
    ~Cat();
    void cat_info() const
    {
        std::cout<<"cat info name:"<<name<<std::endl;
    }
    std::string get_name() const
    {
        return name;
    }
    void set_cat_name(const std::string &name)
    {
        this->name=name;
    }
    private:
    std::string name{"Mimi"};
};
#endif

2.头文件对应的cpp:

#include "cat.h"
Cat::Cat(std::string name):name(name)
{
    std::cout<<"Constructor of Cat:"<<name<<std::endl;
}
Cat::~Cat()
{
    std::cout<<"Destructor of Cat"<<std::endl;
}

3.主函数:

#include<iostream>
#include<memory>//使用智能指针的头文件
#include"cat.h"
using namespace std;
int main(int argc, char *argv[])
{
    //stack
    Cat c1("OK");
    c1.cat_info();
    {
    Cat c1("OK");
    c1.cat_info();
    }
    
    return 0;
}

运行结果:
在这里插入图片描述

结论:在栈分配的局部变量生命周期结束后自动释放

二、原始指针

1.使用原始指针构建对象

#include<iostream>
#include<memory>
#include"cat.h"
using namespace std;
int main(int argc, char *argv[])
{
     //heap
    //raw pointer
    Cat *c_p1=new Cat("yy");
    c_p1->cat_info();
    {
        Cat *c_p1=new Cat("yy");
        c_p1->cat_info();
    }
    cout<<"----- yz -----"<<endl;
    return 0;
}

运行结果:
在这里插入图片描述
以下用来验证局部指针释放后不影响外部指针:

 Cat *c_p1=new Cat("yy");
    c_p1->cat_info();
    {
        Cat *c_p1=new Cat("yy_scope");
        c_p1->cat_info();
        delete c_p1;
    }
    delete c_p1;
    cout<<"----- yz -----"<<endl;
    return 0;

运行结果:
在这里插入图片描述
结论:在堆上分配的局部变量生命周期结束后不会自动释放,需要程序员手动释放
2.使用原始指针会出现安全性问题:


 Cat *c_p1=new Cat("yy");
    c_p1->cat_info();
    {
         c_p1=new Cat("yy_scope");
        c_p1->cat_info();
        delete c_p1;
    }
    delete c_p1;
    cout<<"----- yz -----"<<endl;
    return 0;

运行结果:
在这里插入图片描述
结论:对同一个指针指向的内存释放两遍会引起程序的崩溃

三、unique_ptr

使用unique_ptr可以避免原始指针的安全性问题,它有三种使用方法
1.第一种方法:通过已有的裸指针创建

 //unique_pointer 的三种创建方式
    //第一种
    Cat *c_p2=new Cat("yz");
    std::unique_ptr<Cat> u_c_p2{c_p2};
   // c_p2还能用吗?不能!建议销毁,否则如下,就不是独享语义了
/*-------------------------------*/
    c_p2->cat_info();
    u_c_p2->cat_info();
    c_p2->set_cat_name("ok");
    u_c_p2->cat_info();
/*-------------------------------*/
    c_p2=nullptr;
    delete c_p2;
    
    u_c_p2->cat_info();
    cout<<"----- yz -----"<<endl;
    return 0;

运行结果:
在这里插入图片描述

    c_p2->cat_info();
    u_c_p2->cat_info();
    c_p2->set_cat_name("ok");
    u_c_p2->cat_info();
    cout<<c_p2<<endl;
    cout<<u_c_p2.get()<<endl;

运行结果:
在这里插入图片描述
结论:第一种方法容易出现独享语义冲突的问题。
2.第二种方法 new

//第二种 用new
    std::unique_ptr<Cat> u_c_p3{new Cat("dd")};
    u_c_p3->cat_info();
    u_c_p3->set_cat_name("oo");
    u_c_p3->cat_info();
    cout<<"----- yz -----"<<endl;

运行结果:
在这里插入图片描述
3.第三种方法 make_unique(建议使用第三种方法)

    //第三种 std::make_unique
    std::unique_ptr<Cat> u_c_p4=make_unique<Cat>();
    u_c_p4->cat_info();
    u_c_p4->set_cat_name("oo");
    u_c_p4->cat_info();
    cout<<"----- yz -----"<<endl;

运行结果:
在这里插入图片描述
结论:使用智能指针后系统可以自动回收内存,避免内存泄漏问题。
4.补充:用unique指针创建int对象

 //第二种 用new
    std::unique_ptr<int> u_i_p3{new int(100)};
    cout<<"int address:"<<u_i_p3.get()<<endl;//打印地址
    cout<<*u_i_p3<<endl;

//第三种 std::mak_unique
    std::unique_ptr<int> u_i_p4=make_unique<int>(200);
    cout<<"int address:"<<u_i_p4.get()<<endl;//打印地址
    cout<<*u_i_p4<<endl;

运行结果:
在这里插入图片描述

四、unique_ptr与函数调用

1.passing by value
1.1需要用move来转移内存拥有权。
unique_ptr采用独享语义,不能同时存在两个指向同一个对象的指针,如果在函数调用时不使用move的话会使程序报错。
在这里插入图片描述下面是使用了move后的代码:

#include<iostream>
#include<memory>
#include"cat.h"
using namespace std;
void do_with_cat_pass_value(std::unique_ptr<Cat> c)
{
    c->cat_info();
}
int main(int argc, char *argv[])
{
    std::unique_ptr<Cat> c1=make_unique<Cat>("ff");
    do_with_cat_pass_value(move(c1));
     cout<<"----- yz -----"<<endl;
    return 0;
}

运行结果:
在这里插入图片描述
以下验证:对上面的代码稍作修改,用来验证使用了move后,原来的指针c1失效:

int main(int argc, char *argv[])
{
//1.pass by value
    
    std::unique_ptr<Cat> c1=make_unique<Cat>("ff");
    do_with_cat_pass_value(move(c1));
    c1->cat_info();
    cout<<"----- yz -----"<<endl;
    return 0;
}

运行结果:
在这里插入图片描述
1.2如果参数直接传入std::make_unique语句,自动转换为move

int main(int argc, char *argv[])
{
//1.pass by value
    

    std::unique_ptr<Cat> c1=make_unique<Cat>("ff");
    do_with_cat_pass_value(move(c1));
    do_with_cat_pass_value(make_unique<Cat>());//自动move
    
     cout<<"----- yz -----"<<endl;
    return 0;

运行结果:
在这里插入图片描述
2.pass by reference(引用)
2.1没加const

void do_with_cat_pass_ref(std::unique_ptr<Cat> &c)
{
    c->set_cat_name("oo");
    c->cat_info();
    c.reset();
}
int main(int argc, char *argv[])
{
     //2.pass by ref
    unique_ptr<Cat> c2=make_unique<Cat>("f2");
    do_with_cat_pass_ref(c2);
    c2->cat_info();
    cout<<"address"<<c2.get()<<endl;
     cout<<"----- yz -----"<<endl;
    return 0;
}

运行结果:
在这里插入图片描述
以下验证:在函数里边释放指针后原来指针失效。

int main(int argc, char *argv[])
{
     //2.pass by ref
    unique_ptr<Cat> c2=make_unique<Cat>("f2");
    do_with_cat_pass_ref(c2);
    //c2->cat_info();
    cout<<"address"<<c2.get()<<endl;
     cout<<"----- yz -----"<<endl;
    return 0;
}

运行结果:
在这里插入图片描述

void do_with_cat_pass_ref(std::unique_ptr<Cat> &c)
{
    c->set_cat_name("oo");
    c->cat_info();
   
}
int main(int argc, char *argv[])
{
        //2.pass by ref
    unique_ptr<Cat> c2=make_unique<Cat>("f2");
    do_with_cat_pass_ref(c2);
    c2->cat_info();
    cout<<"address"<<c2.get()<<endl;
     cout<<"----- yz -----"<<endl;
    return 0;
}

运行结果:
在这里插入图片描述
结论:在函数里面释放后c2地址为0;如果在函数调用里面没有释放,c2地址不为0。
2.2加const,此时不允话修改指向了
在这里插入图片描述

void do_with_cat_pass_ref(const std::unique_ptr<Cat> &c)
{
    c->set_cat_name("oo");
    c->cat_info();
    //c.reset();//不允话reset
}
int main(int argc, char *argv[])
{
        //2.pass by ref
    unique_ptr<Cat> c2=make_unique<Cat>("f2");
    do_with_cat_pass_ref(c2);
    c2->cat_info();
    cout<<"address"<<c2.get()<<endl;
     cout<<"----- yz -----"<<endl;
    return 0;
}

运行结果:
在这里插入图片描述
3.pass by return value
指向一个local object,可以用作链式函数

std::unique_ptr<Cat> get_unique_ptr()
{
    std::unique_ptr<Cat> p_dog=std::make_unique<Cat>("Local cat");
    return p_dog;
}
int main(int argc, char *argv[])
{
     //链式
    get_unique_ptr()->cat_info();
     cout<<"----- yz -----"<<endl;
    return 0;
}

运行结果:
在这里插入图片描述

cout<<"unique address:"<<p_dog.get()<<endl;
 cout<<"unique address:"<<&p_dog<<endl;

运行结果:
在这里插入图片描述
为什么地址返回的不一样,因为get返回的是指针指向的内存的地址,&返回的是指针的地址。

补充实验:

std::unique_ptr<Cat> get_unique_ptr(string name)
{
    std::unique_ptr<Cat> p_dog=std::make_unique<Cat>(name);
    cout<<"unique address:"<<p_dog.get()<<endl;
    cout<<"unique address:"<<&p_dog<<endl;
    return p_dog;
}

int main(int argc, char *argv[])
{

    //链式
    unique_ptr<Cat> p_dog1=get_unique_ptr("dog1");
    unique_ptr<Cat> p_dog2=get_unique_ptr("dog2");
    p_dog1->cat_info();
    p_dog2->cat_info();
     cout<<"----- yz -----"<<endl;
    return 0;
}

运行结果:
在这里插入图片描述

总结

以上就是unique_ptr的用法。
这是本菜看大佬视频做的笔记,参考链接: C++现代实用教程:智能指针

cainiaotuibianriji
关注 关注
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++11新特性之智能指针(shared_ptr/unique_ptr/weak_ptr)
09-01
本文主要讨论了三种智能指针:`shared_ptr`、`unique_ptr`和`weak_ptr`。 首先,`shared_ptr`是引用计数型智能指针,它维护了一个内部的引用计数,用于跟踪有多少个`shared_ptr`实例指向同一对象。当创建一个新的`...
智能指针 unique_ptr 详解
热门推荐
顺其自然~专栏
02-22 2万+
一、智能指针 1.什么是智能指针 简单地说,C++智能指针是包含重载运算符的类,其行为像常规指针,但智能指针能够及时、妥善地销毁动态分配的数据,并实现了明确的对象生命周期,因此更有价值。 2.常规指针存在的问题 C++在内存分配、释放和管理方面向程序猿提供了全面的灵活性。但是这种灵活性是把双刃剑,一方面它使C++成为一种功能强大的语言,另一方面它让程序猿能够制造与内存相关的问题,比如内存泄漏。 例如在堆声明和分配的内存,析构方法是否会自动销毁对象,又或是方法结束后需要一个个释放,方法存在很多返回的
unique_ptr的常用操作详解——(C++11智能指针)
机会是给有准备的人
04-15 3129
C++中,动态内存的使用很容易出问题,因为要确保在正确的时间释放内存是极其困难的。有时会忘记释放内存,在这种情况下会产生内存泄露;有时在尚有指针引用内存的情况下就释放了它,在这种情况下就会产生引用非法内存的指针。C++智能指针是包含重载运算符的类,其行为像常规指针,但智能指针能够及时、妥善地销毁动态分配的数据,并实现了明确的对象生命周期,因此更有价值。
ULONG_PTR的作用
最新发布
weixin_45263663的博客
09-12 265
ULONG_PTR就是能够装得下指针的无符号整数,在32位被定义成unsigned long,在64位被定义成unsigned __int64,w64是如果是64位则警告。所以,ULONG_PTR就是 unsigned long *,GDI+中好像就是这么定义的。指针不支持比较大小,将指针转换成ULONG_PTR类型,可以比较大小。从ULONG_PTR本身来看,应该是一个无符号long型指针。在进行指针的整数运算时可以用ULONG_PTR作类型转换。
C++11智能指针】unique_ptr概述、初始化、常用操作、返回unique_ptr、指定删除器、尺寸
脚踏实地,仰望星空
02-27 7302
1.unique_ptr概述 2.unique_ptr的初始化 2.1 直接初始化 2.2 make_unique函数 3.unique_ptr不支持拷贝构造和拷贝赋值 4.unique_ptr支持移动构造和移动赋值 5.unique_ptr的常用操作 6.返回unique_ptr 7.指定删除器 8.unique_ptr的尺寸
C++智能指针之unique_ptr
CltCj的博客
11-26 7956
C++中,动态内存的申请和释放是通过运算符:new 和 delete 进行管理的。其中 new 负责申请内存,delete负责释放内存。动态内存的使用很容易出现问题,这主要在于你需要保证在正确的时间释放内存,这是比较困难的,如果你忘记释放内存,就会造成内存泄露;有时在还有指针引用内存的情况下我们就释放了它,在这种情况下就会产生引用非法内存的指针。
C++11新特性——智能指针之unique_ptr
m0_67168421的博客
12-12 1607
C++11
C++使用lambda代替 unique_ptr 的Deleter的方法
08-30
然而,直接使用lambda作为`unique_ptr`的Deleter模板参数是不被允许的,因为lambda表达式的类型没有默认构造函数,这违反了`unique_ptr`的要求。 以下是详细的解释: 1. 在代码块`//1`中,`go_de`是一个自定义的...
C++ unique_ptr weak_ptr shared_ptr auto_ptr智能指针.doc
07-23
C++ 中,有四种智能指针:auto_ptrunique_ptr、shared_ptr 和 weak_ptr,每种智能指针都有其特点和使用场景。 一、auto_ptr auto_ptrC++98 中引入的智能指针,它可以自动释放动态分配的内存。但是,auto_...
C++11智能指针中的 unique_ptr实例详解
08-19
通常,我们使用new运算符动态分配内存,然后将返回的指针传递给unique_ptr的构造函数。例如: ```cpp unique_ptr<int> pInt(new int(5)); ``` 这将创建一个unique_ptr实例,它管理着一个整型对象,初始值为5。 2. ...
unique_ptr源码
02-28
该文档是C++ auto_ptr源码,感兴趣的可以自行下载学习,方便大家学习参考。
unique_ptr使用
weixin_46153050的博客
09-06 915
一、unique_ptr基本使用 class ClassTest { public: string name; ClassTest() {} ClassTest (const ClassTest& c) { name = c.name; cout <<"class copy construct" << endl; } }; unique_ptr<ClassTest> ptr_1(new ClassTest()); unique_ptr<Cla
C++11】unique_ptr智能指针使用详解
xiaofeizai1116的博客
11-17 1044
C++11 unique_ptr智能指针使用详解
C++unique_ptr独占型智能指针详解
Yngz_Miao的博客
04-24 2万+
指针是C/C++区别于其他语言的最强大的语法特性,借助指针,C/C++可以直接操纵内存内容。但是,指针的引入也带来了一些使用上的困难,这要求程序员自己必须手动地对分配申请的内存区进行管理。 本文实例源码github地址:https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2020Q2/20200424。 unique_ptr基本用法 un...
探究C++11智能指针之std::unique_ptr
乐学吧
06-01 2291
谈起C++,它被公认为最难学的编程语言之一,不仅语法知识点广泛,细节内容之多,学习难度和学习周期也长,导致好多新入行的开发者对C++“敬而远之”,甚至“从入门到放弃”。自C++11开始,好多C++程序员慢慢的感受到了C++的魅力所在,似乎难度也越来越小。 本文要讲的是C++11引入的智能指针之std::unique_ptr。​std::unique_ptrC++11引入的智能指针,拥有资源的唯一所有权,头文件 #include 。unique_ptr指针指向的堆内存空间的引用计数为 1,如
智能指针之unique_ptr 详细使用大全
hfwyydy的博客
05-03 1580
#include <iostream> #include <memory> #include <vector> using namespace std; class Point { public: Point(int x = 0, int y = 0) :m_x(x), m_y(y) { cout << "constructor " << m_x << endl; } Point(const Point& .
Unique_ptr
m0_57719144的博客
06-10 1063
一、unique_ptrunique_ ptr实现了独享被管理对象指针的概念,这意味这它可确保一个对象和其对应的资源同一时间只被一个unique_ ptr对象拥有。一旦拥有者 被销毁或者变成empty或者开始拥有另一个对象的地址,先前拥有的那个对象就会被销毁,其任何相应资源亦会被释放。1、unique_ptr对象不能进行复制操作只能进行移动操作。2、unique是独特的、唯一的意思,故名思议,unique_ptr可以\"独占\"地拥有它所指向的对象。
C++智能指针auto_ptrunique_ptr、shared_ptr、weak_prt详解
GodFishhh的博客
02-03 2111
C++智能指针auto_ptrunique_ptr、shared_ptr、weak_prt详解
C++:智能指针unique_ptr详解 | 简单模拟unique_ptr部分功能 | unique_ptr使用场景
Sauron7i的博客
04-02 2009
C++:智能指针unique_ptr详解 | 简单模拟unique_ptr部分功能 | unique_ptr使用场景
unique_ptr使用案例
05-01
下面列举几个unique_ptr使用案例: 1.管理动态分配的对象:使用unique_ptr可以更方便地管理动态分配的对象,比如以下代码: ``` unique_ptr<int> p(new int(10)); //创建一个unique_ptr对象管理一个动态分配的int...
写文章

热门文章

  • 卡尔曼滤波与航迹融合 11971
  • 联想拯救者Y7000如何重装系统 6149
  • shared_ptr的使用 5163
  • 负数的原码、反码和补码 4437
  • unique_ptr的使用 2671

最新评论

  • 卡尔曼滤波与航迹融合

    m0_52165668: 请问BC融合算法的Pij怎么求啊

  • 负数的原码、反码和补码

    做而论道_CS: 一个补码,它代表的十进制数,是多少? 也不难求。 你只需记住:【补码首位的权,是负数】。 一般的八位二进制数,各个位的权是:   128、64、32、16、8、4、2、1; 如果是八位的补码,各个位的权则是:  -128、64、32、16、8、4、2、1。   例如,有一个补码:1110 0001, 它代表的十进制是:-128 + 64 + 32 + 1 = -31。 如果,另一个补码:0110 0001, 它代表的十进制是:0 + 64 + 32 + 1 = +97。 仅仅使用【进制转换】,不就完事了! ---------------------- 正负数值与其 “补码”,可以直接互相转换。 并不需要什么 “符号位原码反码取反加一”。 看过《卖拐》吧? 知道谁是 “大忽悠” 吧? 其实,计算机专家和老师,才是真正的大忽悠! 东北的老赵,远远跟不上他们! 学完了计算机,你就看不见老赵了!

  • 负数的原码、反码和补码

    做而论道_CS: +99、+255,都可以当做-1 ! 为什么呢? 绝对不是因为 “符号位原码反码补码 ... ” 。 而是你【舍弃了进位】! 也就是:减去了进位。 进位是多少?  两位十进制,进位就是:10^2 = 100;  八位二进制,进位就是:2^8 = 256。 那么:  加 99,就是:+99-100 = -1。  加 255,就是:+255-256 = -1。  加 254,就是:+254-256 = -2。  加 253,就是:+253-256 = -3。  。。。 这些个正数,都可以当做负数使用。 其原因,不过就是一个小学的算术题而已。 计算机专家,由此就 “发明” 了补码! 真不要 FACE 了。 ------------- 那么,负数的 “补码”,应该怎么求呢? 你一定能总结出规律:  负数的补码 = 256 + 该负数。 如,-38 存入计算机,是什么样子? 解:-38 + 256 = 218,   218 = 1101 1010 (二进制)。 这就是-38 的 “补码”。 求补码,并不需要掌握:  机器数真值符号位原码反码补码正数三码相同  负数取反加一符号位不变模符号位也参加运算 ... 这些,就是全背下来,也不能理解:  加法,怎么就成了减法呢? ------------- 另外,正数的 “补码”,又该怎么求呢? 也用同样的公式:  正数的补码 = 256 + 该正数。 加上 256,就会出现进位!那就舍弃了吧。 于是,公式就简化为:  正数的补码 = 该正数。 这就证明了:  零和正数的补码,就是其本身。 ------------- 老外的数学水平太洼,算术能力不行。 计算二进制数,手指头,更是不好用了。 实在算不出来,所以,才编造了一大批谎言。 我们的老师的数学水平,倒也不见得很差。 但是,盲目的迷信与崇外,也就只会跟疯了。 拿小学知识唬弄大学生,甚至还成了考研内容? 真是毁人不倦坑人不浅!

  • 负数的原码、反码和补码

    做而论道_CS: 虽然,计算机,使用二进制数。 但是,二进制数,也是数,并不是什么什么码。 如果用数字表示其它信息,才能叫做“码”。 如:学号门牌车牌电话性别英文汉字声音图像颜色... 实际上,原码反码取反加一...,都是不存在的。 所谓的 “补码”,也是一个简单算术题目而已。 补码,对任何进制,都是适用的。 你看十进制数,两位,真值是:0 ~99。 这个 +99,就可以当做 “负一” 使用。 如:27 + 99 = (一百) 26   27 - 1 = 26 只要你舍弃进位,依旧保持两位数:  减法,就能用加法来实现。  正数,也就能当成负数来使用。 在计算机中舍弃进位,就可以省掉减法器了。 舍弃进位意义就是:简化计算机的硬件。 ----------------- 计算机的字长,是固定的。 八位机,它只会做:  八位 + 八位 = 一个进位、八位的和。 八位二进制,真值是:0000 0000 ~ 1111 1111。 换算到十进制,就是:0 ~ 255。 这个 255,就可以当做-1 使用。 如 27 - 1 = 26,八位机的算法如下:    0001 1011   + 1111 1111  (即 255) --------- (进 1 ) 0001 1010 你舍弃进位,取八位的结果,就是 26。 于是,你就用加法器,实现了减法运算!

  • 创建一个基本的win32窗口

    -StarsTwinkle-: 听不懂,思....... [code=cpp] #include<bits/stdc++.h> [/code]

最新文章

  • 创建一个基本的win32窗口
  • 负数的原码、反码和补码
  • VS2017配置OPENGL
2023年6篇
2022年22篇
2021年8篇
2020年5篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家玻璃钢雕塑神像厂家红色玻璃钢卡通雕塑推荐货源云南玻璃钢浮雕园林雕塑公司龙泉玻璃钢雕塑热线电话石家庄玻璃钢雕塑景观厂户外园林景观玻璃钢雕塑白兔摆件泰安市玻璃钢雕塑定制玻璃钢雕塑一般选用什么树脂义乌玻璃钢昆虫雕塑定制园林玻璃钢民俗雕塑工程青岛玻璃钢卡通雕塑绍兴玻璃钢雕塑摆件销售厂家定安县玻璃钢雕塑制作厂家宿州定做人物玻璃钢雕塑玻璃钢雕塑雕塑制作流程四川常用商场美陈研发天津玻璃钢模型雕塑宿州多彩玻璃钢雕塑定制玻璃钢花盆生产工艺流程河北创意玻璃钢雕塑销售厂家玻璃钢 雕塑雕塑商场装饰玻璃钢人物雕塑佛山玻璃钢楼盘景观雕塑供应商武汉小品系列玻璃钢雕塑厂家购买罗马柱玻璃钢雕塑商场户外美陈灯光泡沫雕塑和玻璃钢雕塑湛江信誉好的玻璃钢雕塑淮安玻璃钢动漫卡通雕塑设计玻璃钢雕塑上色制造过程香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化