2012-12-10 4 views
20
buffer = new char[64]; 
buffer = std::make_shared<char>(char[64]); ??? 

make_shared<>()을 사용하여 배열에 메모리를 할당 할 수 있습니까?make_shared와 같은 것으로 배열을 할당 할 수 있습니까?

은 내가 할 수있는 : buffer = std::make_shared<char>(new char[64]);

하지만 여전히 새로운 호출 포함, 그것은 make_shared 안전하고 효율적입니다 내 이해입니다.

+3

'표준 : : 벡터 버퍼 (64), ' –

답변

19

make_shared의 포인트는 공유 포인터의 제어 블록에 관리 객체를 포함하는 것입니다, 당신은 아마 당신의 목표를 만족시킬 것 C++ (11) 배열을 사용하여 C++ (11)와 상대하고 있기 때문에

? std::shared_ptr (std::unique_ptr 달리, 예를 들어) operator[]을 제공하지 않기 때문에, 당신은 [] 새로운에서 얻을 것 포인터로 공유 포인터 같은 방법을 사용할 수 없습니다

#include <memory> 
#include <array> 
int main() 
{ 
    auto buffer = std::make_shared<std::array<char, 64>>(); 
} 

참고. 역 참조해야합니다 : (*buffer)[n] = 'a';

+0

왜 그렇습니까? 나는 새로운 C++ 11 트릭을 배우는 것을 멈추지 않는다 ... –

+0

비록 컴파일 시간에 배열의 크기를 지정할 수 없습니까? –

+2

@JoshElias 물론 컴파일 할 수 있습니다. 런타임을 의미합니까? 'make_shared '는 런타임 인자를'T'의 생성자에 전달하기 때문에 배열 크기를 생성자 인자로받는 클래스를 필요로합니다. 아니면 공유 벡터를 만드십시오. – Cubbi

1

어때요?

template<typename T> 
inline std::shared_ptr<T> MakeArray(int size) 
{ 
    return std::shared_ptr<T>(new T[size], [](T *p){ delete [] p; }); 
} 

auto buffer = new char[64]; 
auto buffer = MakeArray<char>(64); 
+0

새로운'shared_ptr'을 생성하고'make_shared'를 사용하는 것 사이에는 차이가 있습니다. 나중에는 원자 적 연산이 1 개 더 적고 가능할 때마다 선호됩니다. – SagiLow

2

할당 된 메모리를 공유해야합니까? 당신은 대신 std::unique_ptr를 사용에 std::make_unique 사용할 수 있습니다 C++ 14 :

auto buffer = std::make_unique<char[]>(64); 

C++ 20에서 사용할 수있는 std::make_shared 버전이있을 것입니다 :

auto buffer = std::make_shared<char[]>(64);