2009-10-13 4 views
1

그것은이 버그C++ GCC 4.3.2 에러

Question about storing array in a std::vector in C++

에 문제점이 유사하지만 다른 이유 (아래 참조). C++에서 다음 샘플 프로그램에 대한

:

#include <vector> 

int main(int c_, char ** v_) 
{ 
     const int LENGTH = 100; 

     std::vector<char[LENGTH]> ca_vector; 

     return 0; 

} 

GCC 4.2.3 깨끗하게 컴파일합니다. GCC 4.3.2 다음과 같은 오류가 방출 :

 
/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h: In function ‘void std::_Destroy(_Tp*) [with _Tp = char [100]]’: 
/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h:103: instantiated from ‘void std::_Destroy(_ForwardIterator, _ForwardIterator) [with _ForwardIterator = char (*)[100]]’ 
/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h:128: instantiated from ‘void std::_Destroy(_ForwardIterator, _ForwardIterator, std::allocator&) [with _ForwardIterator = char (*)[100], _Tp = char [100]]’ 
/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_vector.h:300: instantiated from ‘std::vector::~vector() [with _Tp = char [100], _Alloc = std::allocator]’ 
test.cpp:7: instantiated from here 
/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h:88: error: request for member ‘~char [100]’ in ‘* __pointer’, which is of non-class type ‘char [100]’ 

이유는 분명히 인해 잘못된 배열에 대한 포인터 붕괴에, 나는 생각한다,라고

include/g++-v4/bits/stl_construct.h

template 
    inline void 
    _Destroy(_Tp* __pointer) 
    { __pointer->~_Tp(); } 

에서이 비트입니다.

내 질문 : std :: vector에 배열 저장을 방해하는 언어 표준이 있습니까? 아니면 특수 GCC 버전의 버그입니까?

필자는이 내용을 컴파일해야한다고 생각합니다 (예 : 4.2.3이 맞습니다).

감사 마틴은

+0

std :: string을 사용하지 않는 이유는 무엇입니까? – kmarsh

+0

코드가 GCC 4.2.3에서 컴파일되고 실행되었음을 말합니까? – fpmurphy1

+0

그래도 시스템에서 컴파일됩니다. 그리고 그것은 작동하는 것 같습니다. – martin

답변

6

예 CopyConstructible (복사 가능 생성자) 유형의 요구 사항을 충족해야합니다 (23 개) 컨테이너

에게 이러한 구성 요소에 저장된 개체의 유형을 Draft C++98 Standard

섹션을 사용하여 배열을 사용하여 표준 정지에 뭔가가있다 (20.1.3) 및 할당 가능 유형의 추가 요구 사항을 준수해야합니다. 구성 요소가 다양한 용기

20.1.3이다

는 타입 소멸자을 가지고있는 조건을 포함한다.

저는 벡터가 요소를 할당하고 삭제해야한다고 생각합니다. C++은 char []를 복사하거나 삭제하는 것을 어떻게 알고 있습니까?

+0

참고, 좋은 직업에 감사드립니다. 그것을 스스로 발견 했어야하지만, 너무 막혔습니다. 다른 답변도 정확합니다. 가장 빠른 답변이므로 마킹입니다. 마틴 – martin

+0

안부를 잘못 읽었을 것입니다. 'std :: vector '는 int가 소멸자가 없더라도 매우 합법적입니다. – MSalters

+0

x = new int (5) : x를 삭제할 수 있습니다. -하지만 배열을 삭제하려면 삭제 [] – Mark

-1

이 코드에 대해 알고 싶습니다. 이미 알고 있듯이 벡터도 일종의 배열이며 초기 크기를 지정하지 않아도됩니다.

1D vector -> std::vector<char*> ca_vector; 
2D vector -> std::vector<char*,char*> ca_vector; 
+0

안녕하세요, 답변 주셔서 감사합니다. 나는 당신이 정확하게 지적했듯이 벡터를 배열로 사용할 수 있다는 것을 알고있다. 위의 코드가 표준의 의미에서 합법적인지 알고 싶습니다. 나는 문자열 벡터 벡터 을 넣을 수 있었지만 Mark가 작성한 것처럼 기본 C/C++ 배열은 컨테이너 요소에 대한 요구 사항을 충족시키지 못합니다. – martin

+0

@Aykut : std :: vector 은 이해가되지 않습니다. – sellibitze

+1

벡터에 대한 두 번째 템플릿 인수는 두 번째 차원 유형이 아닙니다 (벡터는 한 차원 만 갖습니다). 두 번째 인수는 allocate (표준 할당 자에 대한 기본값)입니다. –

2

아니요, 귀하가 연결 한 질문에 허용되지 않은 것처럼 허용되지 않습니다. ("이유가 어떻게 다른지"는 알 수 없습니다.) 두 가지 질문 중 하나에서 "버그"가 아닙니다. 적어도 컴파일러의 버그는 아닙니다. 그냥 코드에서. ;)

벡터에 벡터를 복사 할 수 있고 할당 할 수 있어야하므로 배열을 벡터에 저장할 수 없습니다. 이 작업을 수행하는

2

가장 쉬운 솔루션입니다 : 당신이없는

std::vector<boost::array<LENGTH> > ca_vector; 

이 방법은 배열/포인터 이야기를 귀찮게. 정말 이것을 원하든, 또 다른 질문입니다.

+0

입력 주셔서 감사합니다. 사실 내 구체적인 경우 벡터 은 (레거시) 소스 코드에서 문제를 (아마도 의도) 솔루션입니다 (그래서 원시 바이트 또는 아무것도하지만 그냥 문자열). 왜 이미 벡터가있을 때 char [] 배열과 문자열이 아닌지 확실하지 않고 원래 작성자의 일부분에 대해서만 모호한 (아마도 잘못 인도 한) 최적화 고려 사항을 상상할 수 있습니다 ... – martin

+0

문자열을 사용하는 경우 문자열을 사용합니다. 바이트 기반 메시지를 stl 컨테이너에 저장하는 임시 솔루션으로 구조를 사용했습니다. – stefaanv

+0

또는 std :: vector > ca_vector; –