2016-08-13 3 views
3

new 또는 스마트 포인터에 메모리 크기가 필요하다고 생각합니다. 클래스에 string이 있으면 클래스를 할당합니다. 그런 다음 문자열에 새로운 값을 할당합니다. 메모리를 초과합니까? 이 예를 들어 문자열이 들어있는 새 클래스에 대한 포인터를 만듭니다.

// a.hpp 
#include <string> 
#include <memory> 
#include <armadillo> 

class A { 
public: 
    A(const std::string &); 
private: 
    struct Impl; 
    std::shared_ptr<Impl> impl; 
}; 

// a.cc 
struct A::Impl { 
    Impl(const std::string &f) 
    { 
    // read config file and get name and size of x 
    name = "abc"; 
    x.zeros(2, 3); 
    } 

    std::string name; 
    arma::mat x; 
}; 

A::A(const std::string &f): 
    impl(std::make_shared<Impl>(f)) {} 

, 난 단지 N 메모리를 할당 생각하지만, 나는 N+M 메모리를 사용합니다. 위험한가요?

+0

'std :: string'은 값을 저장하는 데 필요한 메모리를 할당합니다. 완료되면 풀어주세요. 아무 것도 할 필요가 없습니다. –

+0

Bo Persans가 string 생성자에서 문자열 초기화를 제공하는지 또는 문자열을 제공하는지 여부와 상관없이 문자열 객체에 대한 메모리를 할당하는 방식에 관계없이 스택 또는 힙 중 어느 것이 든 객체를 만들 때. 값을 변경하면 나중에 메모리가 재 할당됩니다. 재배치 문제에 관심이 있는지 여부는 당신에게 달린 것입니다. 내가 틀렸다면 누군가는 나를 바로 잡으십시오. – TimLayne

+0

Pimpl 구조체에 대한 생성자 및 기본 생성자를 제공하지 않았으므로 할당 할 값을 제공해야합니다. – TimLayne

답변

1

할당 연산자 std::string은 필요한 모든 메모리 할당을 처리합니다. 그 점을 염려 할 필요가 없습니다.

+0

누군가가 메모리 소비, 할당 등에 관심이 있다면, 메모리 사용량이 핵심 클래스 객체보다 높습니다. 그러나 어쩌면이 지식은 모든 상황에서 요구되는 것은 아닙니다. –

0

토르 죠른의 대답은 훌륭합니다. 몇 가지 추가 점을 추가하는 것입니다.

문자열 클래스 자체에는 sizeof에서 가져올 수있는 크기의 특정 값이 있어야합니다. 그것이 당신이 실제로 자신의 수업에 저장하는 것입니다. 그런 다음 문자열에 저장된 데이터의 경우 에서 파생되었으며 문자열 개체 (일반적으로 일부 문자열이어야 함 (문자열의 시작 지점 일 수 있음)이지만 확실하지 않습니다. 그래서 걱정할 필요가 없습니다. 표준 라이브러리는 이미 이 포장되어 있습니다.입니다.

관련 문제