智能指针与数组

Posted sesiria

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智能指针与数组相关的知识,希望对你有一定的参考价值。

有的时候需要由local函数在heap中alloc 一个数组空间并返回给外部使用。例如在windows编程中常常需要转换编码,

转换编码返回值常常是alloc 在heap中如果例如返回一个char *. 如果外部在使用完以后不做删除操作就容易造成内存泄漏。

本质上char* 在heap中是一个char[] 。可以将返回值存在智能指针中,来自动销毁(shared_ptr, unique_ptr)


C++11智能指针处理Array对象


//C++11的<memory>中有一整套智能指针,
//完全可以避免写手动的delete代码,
//但是它默认使用delete删除对象,
//如果是数组对象,需要指定自定义的删除方法,支持delete[]
std::shared_ptr<int> p(new int[10],
    [](int* p)
        delete[] p;
    );
//或者使用helper
std::shared_ptr<int> p(new int[10],std::default_delete<int[]>()); 

unique_ptr跟shared_ptr不一样,它直接支持持有数组对象


std::unique_ptr<int[]> p(new int[10]);//ok
std::shared_ptr<int[]> p(new int[10]);//error, does not compile

std::unique_ptr<int, void(*)(int*)> p(new int[10],
    [](int* p)
        delete[] p;
    );

一个智能指针自动删除对象数组的例子

#include <iostream>
#include <memory>

class myData

public:
    myData():num(new int)
    
    
    void setValue(const int n)
    
        *num = n;
    
    int getValue() const
    
        return *num;
    
    ~myData()
    
        std::cout<<"Call the destructor to delete the data"<<*num<<std::endl;
        if(num)
            delete num;
            num = NULL;
        
    
private:
    int * num;
;


class data

public:

private:
    int * p_data;
;

myData* allocNum()

    myData* num = new myData[10];
    for(unsigned i = 0; i<10; ++i)
        num[i].setValue(i);
    return num;


void test_func()

    std::unique_ptr<myData[]> ptr (allocNum());
    for(unsigned i = 0; i<10; ++i)
        std::cout<<static_cast<myData*>(ptr.get())[i].getValue()<<" ";

    std::cout<<std::endl;


int main()

    test_func();
    return 0;


以上是关于智能指针与数组的主要内容,如果未能解决你的问题,请参考以下文章

Part6 数组指针与字符串 6.10 智能指针 6.11 vector对象

C++ 智能指针 (unique_ptr)

12354

C++|深入理解智能指针

C++指针详解

150809112 杨磊