2009-06-22 4 views
4

포인터가 C++에서 배열을 가리키는 지 여부를 감지하는 방법이 있습니까? 내 문제는 배열의 소유자가되는 클래스를 구현하려는 것입니다. 내 클래스는 포인터로 초기화되고 포인터가 실제로 배열 포인터인지 여부를 알고 싶습니다. 여기서 단순 코드이다포인터가 배열을 가리키는 지 어떤 방법으로 감지하나요?

class ArrayOwner { 
public: 
    explicit ArrayOwner(int* initialArray) : _ptrToArray(initialArray) {} 
    virtual ~ArrayOwner() { delete [] _ptrToArray; } 
private: 
    int* _ptrToArray; 
} 
  • 사용이 확인 될 것이다 ArrayOwner foo는 (새로운 INT [10]);
  • 그러나이 사용법은 입니다. 정의되지 않은 동작이 발생합니다. ArrayOwner foo (new int());

"initialArray"포인터가 실제로 배열 포인터라는 것을 생성자에 assert를 추가하고 싶습니다. 생성자의 계약을 변경할 수 없으며, 벡터 e.t.c를 사용합니다. 이 어설 션을 C++로 작성하는 방법이 있습니까?

+0

대신 Boost Array (http://www.boost.org/doc/libs/1_39_0/doc/html/array.html)와 같은 것을 사용할 수 있는지 고려해야합니다. –

+1

당신이 요구 한 제약 조건을 요구하는 것은 현명한 방법이 아닙니다. 왜 생성자를 변경하거나 std :: vector를 사용할 수 없습니까? –

+1

이 클래스는 C++과 스크립트 간의 상호 작용에 필요합니다. 스크립트는 동적 배열을 할당하고 ArrayOwner로 래핑합니다. 내 수업 내에서 좋아하는 것을 사용할 수 있지만 생성자는 ArrayOwner (int * array) 여야합니다. 나는 초기 배열의 크기를 얻기위한 이식 가능한 방법이 없기 때문에 std :: vector에서 아무 쓸모가 없다. – SadSido

답변

6

아니요, 불행히도 아닙니다. C++ RTTI은 기본 유형으로 확장되지 않습니다.

5

휴대 할 수있는 방법이 없습니다.

0

일반적으로이를 수행하기위한 (단순/휴대용/강력한) 방법은 없습니다.

귀하의 플랫폼을 알고 OS의 모든 새 버전에 맞게 코드를 변경하려는 경우 힙이 어디에 있으며 어떻게 보이는지 확인할 수 있으므로 힙을 걸 으면서이 포인터가 가리키는 블록의 크기를보고 싶어하므로 거기에있는 항목의 수를 계산할 수 있습니다. 그러나 모두는 당신이 그것을하는 것에 대하여 조언 할 것입니다.

1

나는 그렇게 생각하지 않는다. x[]*x은 동의어입니다. 물론 delete을 호출 할 때를 제외하고는 동의어입니다.

4

나에게 나쁜 디자인처럼 보입니다. 새 항목을 분리하지 말고 이렇게 삭제하십시오.

배열은 매개 변수로 전달되지 않고 개체 생성자에 할당되어야합니다.

C++에서의 메모리 관리는 어렵습니다. 이렇게 나쁜 습관으로 더 힘들게하지 마십시오.

+0

그는 "초기화는 자원 획득"을 구현하려고 시도하고있다 (http://www.ddj.com보기/cpp/184403758) – Drakosha

+0

그런 다음 그는 생성자에서 리소스를 얻어야합니다. 이것이 _ptrToArray가 배열을 가리킬 수있는 유일한 방법입니다. – Treb

+1

질문에 주석에서 언급했듯이 클라이언트 스크립트와의 상호 작용이 있습니다. Scripters는 ArrayOwner (int * array)와 같이 초기화 할 수있는 배열 래퍼를 필요로합니다. p.s. 의심 할 여지없이 나쁜 디자인이지만 스크립트를 직접 제어 할 수는 없습니다.우리는 코딩 규칙을 도입하여 스크립터가 정확히 * 배열 *을 통과하도록 강제 할 수 있습니다 ... – SadSido

관련 문제