함수에서 고유 한 void 포인터 반환


11

void *CI에서 함수 를 얻으려면 다음과 같이하십시오 (매우 기본적인 예).

void *get_ptr(size_t size)
{
    void *ptr = malloc(size);
    return ptr;
}

사용할 때 어떻게 같은 결과를 얻을 수 std::unique_ptr<>있습니까?



1
어떤 문제가 있는지 설명해주세요.
molbdnilo

1
일반적인 void unique_ptr에 대한이 답변을 참조하십시오 : stackoverflow.com/a/39288979/2527795
vll

malloc이와 같이 C ++에서 사용해야 할 이유는 거의 없습니다 . 원시 메모리에 대한 포인터를 반환합니다. 사용하기 전에 새 객체를 배치해야합니다. 메모리를 할당 할 때보 다 나중에 오브젝트를 작성해야하는 충분한 이유가없는 경우 적절한 오브젝트를 작성하고 메모리를 할당 new하거나 사용할 메모리를 사용해야 std::make_unique합니다. 두 경우 std::vector와는 reserve확률값입니다. 더 나은. 이것을 사용하지 않더라도 operator new메모리를 할당하는 관용적 방법은 아닙니다 malloc.
호두

답변:


18

당신은 사용을 위해 사용자 정의 Deleter가를 지정해야합니다 void같은 unique_ptr그런 '의 형식 인수 :

#include <memory>
#include <cstdlib>

struct deleter {
    void operator()(void *data) const noexcept {
        std::free(data);
    }
};

std::unique_ptr<void, deleter> get_ptr(std::size_t size) {
    return std::unique_ptr<void, deleter>(std::malloc(size));
}

#include <cstdio>
int main() {
    const auto p = get_ptr(1024);
    std::printf("%p\n", p.get());
}

2

std::freefunctor를 구성하는 대신 삭제기로 직접 사용하는 @RealFresh의 답변 단순화 :

auto get_ptr(std::size_t size) {
    return std::unique_ptr<void, decltype(&std::free)>(std::malloc(size), std::free);
}

그래도 질문에 대한 내 의견을 참조하십시오.


1

대신 char-array에 대한 포인터를 반환하십시오.

#include <memory>

std::unique_ptr<char[]> get_ptr(std::size_t size)
{
    return std::make_unique<char[]>(size);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.