2012-05-07 5 views
0

내 프로그램에서 몇 가지 문제를 해결하려고 노력하고 있으며 복사 생성자 또는 소멸자에 문제가있는 것으로 보입니다. 메모리 예외가 발생합니다. 내가 문자열에게 길을 복사 할 조언을하지 않을배열의 전체 복사본 만들기 C++

for (int i = 0 ; i < arraysize ; i ++) 
    { 
     readArray[i] = a.readArray[i]; 
    } 

답변

10

임의의 개체를 memcpy 개로 복사 할 수는 없으므로 복사 작업자와 실제로 복사해야합니다.

string에는 힙 할당 스토리지에 대한 포인터가있을 가능성이 높습니다. 비트 단위로 복사하면 원래 문자열에서 소멸자를 호출하면 "복사 된"문자열 데이터가 무효화됩니다.

올바르게 수행하려면 std::copy과 같은 것을 사용하십시오.

#include <algorithm> 
... 
std::copy(a.readArray, a.readArray+arraysize, readArray); 
+0

벡터를 사용하지 않고 std :: copy를 어떻게 사용합니까? (이 작업에 벡터를 사용할 수 없음)? 아까운 질문이 있으면 죄송합니다. –

+1

수정 됨. BTW, initializer리스트의'readArray'가 복사 생성자에서 쓸모가 없다면 당신의 초기화가됩니다. - 당신은 그것을 본체에 덮어 씁니다. – Mat

+0

그러나 2 개의 오류가 발생했습니다. 1. 오버로드 된 함수의 인스턴스가 없습니다. "std :: copy"는 인수 목록과 일치합니다. 2. 연산자 "+"는 다음 피연산자와 일치하지 않습니다. S –

6

:

어떤 도움이 날이가 방어 적이기 이외의 배열을 복사하는 더 좋은 방법이 될 것입니다 감사

ArrayStorage::ArrayStorage(const ArrayStorage &a):readArray(a.readArray),arraysize(a.arraysize) 
{ 
    readArray = new string[arraysize]; //create the array 

    memcpy (readArray,a.readArray,sizeof(string)*arraysize);//Copy the values of bytes from the location pointed at by the souce and destination. 
} 

ArrayStorage::~ArrayStorage(void) 
{ 
    delete[](readArray);//deconstuctor to delete the array. 
} 

감사 것 해야 할 것. 문자열이 힙 메모리에 대한 참조를 보유하고 있으므로 실제로 포인터를 복사하므로 두 배열의 문자열이 메모리를 공유합니다. 이것은 매우 C + + - ish과 매우 위험하지 않습니다. 나는 할당 연산자를 사용하거나 스트링에 대해 생성자를 복사하도록 조언한다 (예 사이클을 수행한다).

+1

또는 딥 복사본을 수행하는 것이 '벡터 newlist = oldlist;'처럼 쉬운 경우에도 '벡터 '을 사용하십시오. – Benj

+0

@Benj 동의 - 이것은 더 나은 옵션이지만 질문과 관련이 없습니다 - 그는 왜 이것이 어떻게 작동하지 않는지 묻습니다 : –

+0

배열을 복사하는 가장 좋은 방법은 무엇입니까? –

0

문자열에도 동적 메모리가 있으므로 각 문자열을보고 복사본을 만들어야합니다.

수정 사항은 memcopy 대신 배열의 각 문자열을 복사하는 것입니다. 예외는 메모리 조각에 동일한 포인터를 갖는 두 개의 다른 문자열에서 비롯된 것이며 둘 다 해제하려고 시도하는 것입니다.

0

코드가 의미가 없습니다. 먼저 이니셜 라이저 목록을 통해 복사 할 객체가 전달한 값으로 멤버를 초기화합니다. 그런 다음 동일한 멤버에게 메모리를 할당하고 모든 것을 다시 복사합니다.

대부분의 경우 정크 데이터를 초기화되지 않은 포인터로 복사하고 있습니다. 이니셜 라이저 목록 :readArray(a.readArray),arraysize(a.arraysize)을 제거하십시오.

+0

이니셜 라이저 목록은 내가 얻었던 parasoft 오류 중 일부를 없애기 위해 수행되었습니다. –

+0

@BrianPeach 이니셜 라이저 목록이 메모리 예외가 발생한 이유입니다. – Lundin