2010-12-21 3 views
0

문자열 유형에 대한 포인터를 초기화하고 malloc 함수로 일부 메모리를 할당합니다. 내 문제는이 포인터에 의해 지적 된 문자열 중 하나를 사용하려고 할 때 세그먼트 오류가 발생합니다.C++ 문자열 유형 세그먼트 화 오류에 대한 포인터

string anyString = "anyWords"; 
string *pointerToString; 
pointerToString = (string *) malloc(sizeof(string) * 5); 
pointerToString[i] = anyString; // this line causes segmentation fault 

미리 도움을 청하십시오.

+0

'i'의 값은 무엇입니까? –

+2

여기 malloc을 사용하기 위해 배운 소스를 버려야합니다. –

+0

또는 진짜 언어에 대한 이상한 C++을 버리십시오. 농담이야. – Christian

답변

4

malloc을 C++의 개체와 함께 사용하지 마십시오.

대신, new을 사용

std::string * str = new std::string("Hello"); 
// ... 
delete str; 

배열의 경우 :

std::string * tab = new std::string[5]; 
// ... 
delete[] tab; // if you allocated with new[], release with delete[] 

는이 경우 실패 있어요 이유는 mallocnew는 달리, 클래스의 생성자를 호출하지 않습니다. std::string은 메모리를 자체적으로 할당하므로 결국에는 유효하지 않은 개체가 생성됩니다.

따라서 new/delete (또는 new[] /)이 여기에 오는 길입니다. 원하는 경우 malloc을 계속 사용할 수 있지만 "POD"유형 (기본 유형, 이전 스타일 구조체 등)에 대해서만 사용할 수 있습니다. malloc으로 할당하는 경우 free으로 출시하십시오. newfree 또는 mallocdelete을 섞어서는 안됩니다.이 규칙은 예외입니다 (아래 Mehrdad Afshari의 설명 참조).

+0

고맙습니다. 이것은 내 문제를 해결했다. – user550067

+0

기술적으로'malloc'을 사용하여 생성자를 직접 호출 할 수도 있습니다. 그러나 이것은 나쁘고, 나쁘고, 나쁠 것입니다. –

+0

@ 존 그렇습니다.하지만 제가 생각할 수있는 유일한 좋은 이유는 나중에 초기화하기 위해 대용량 메모리 버퍼를 할당하는 것입니다. 우리는이를 위해 새로운 배치를 얻었습니다. –

5
std::vector<std::string> strings(5); 

이것은 실제로 원하는 것입니다.

0

에 티엔 네가 말한 것처럼, 새로운은 malloc이 메모리 만 할당하지만 해당 메모리를 초기화하는 생성자는 호출하지 않기 때문에 사용해야합니다. std :: string은 클래스이므로 힙에 인스턴스를 만들려면 다른 클래스 유형과 마찬가지로 의 새을 사용해야합니다. 잘못된 주소로 쓰려고 했으므로 세그먼테이션 오류가 발생했습니다.

문자열 배열을 만들고 싶습니다. C에서는 array를 사용하지만 C++에서는 std :: vector를 사용합니다.

0

아마도 그런 식으로하고 싶지는 않을 것입니다. 예를 들어, malloc을 사용하여 메모리를 할당 한 경우 placement-new를 사용해야합니다.

사실,이 작업은 새로운 배치 작업을 수행합니다.

std::vector<std::string> vec; 
vec.reserve(5); 
vec.resize(5); 

호출은 실제로 게재 위치 새에 이미 할당 된 메모리에이 객체를 생성()의 크기를 조정 한 후 예약() 당신을위한 메모리를 할당하고있다.

Placement new in the C++ FAQ이 여기에 잘 설명되어 있습니다. 배우기 위해 그것을 읽으십시오. 아마 단순히 벡터를 사용하십시오.

관련 문제