내 프로그램에서 몇 가지 문제를 해결하려고 노력하고 있으며 복사 생성자 또는 소멸자에 문제가있는 것으로 보입니다. 메모리 예외가 발생합니다. 내가 문자열에게 길을 복사 할 조언을하지 않을배열의 전체 복사본 만들기 C++
for (int i = 0 ; i < arraysize ; i ++)
{
readArray[i] = a.readArray[i];
}
내 프로그램에서 몇 가지 문제를 해결하려고 노력하고 있으며 복사 생성자 또는 소멸자에 문제가있는 것으로 보입니다. 메모리 예외가 발생합니다. 내가 문자열에게 길을 복사 할 조언을하지 않을배열의 전체 복사본 만들기 C++
for (int i = 0 ; i < arraysize ; i ++)
{
readArray[i] = a.readArray[i];
}
임의의 개체를 memcpy
개로 복사 할 수는 없으므로 복사 작업자와 실제로 복사해야합니다.
string
에는 힙 할당 스토리지에 대한 포인터가있을 가능성이 높습니다. 비트 단위로 복사하면 원래 문자열에서 소멸자를 호출하면 "복사 된"문자열 데이터가 무효화됩니다.
올바르게 수행하려면 std::copy
과 같은 것을 사용하십시오.
#include <algorithm>
...
std::copy(a.readArray, a.readArray+arraysize, readArray);
:
어떤 도움이 날이가 방어 적이기 이외의 배열을 복사하는 더 좋은 방법이 될 것입니다 감사
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과 매우 위험하지 않습니다. 나는 할당 연산자를 사용하거나 스트링에 대해 생성자를 복사하도록 조언한다 (예 사이클을 수행한다).
또는 딥 복사본을 수행하는 것이 '벡터
@Benj 동의 - 이것은 더 나은 옵션이지만 질문과 관련이 없습니다 - 그는 왜 이것이 어떻게 작동하지 않는지 묻습니다 : –
배열을 복사하는 가장 좋은 방법은 무엇입니까? –
문자열에도 동적 메모리가 있으므로 각 문자열을보고 복사본을 만들어야합니다.
수정 사항은 memcopy 대신 배열의 각 문자열을 복사하는 것입니다. 예외는 메모리 조각에 동일한 포인터를 갖는 두 개의 다른 문자열에서 비롯된 것이며 둘 다 해제하려고 시도하는 것입니다.
코드가 의미가 없습니다. 먼저 이니셜 라이저 목록을 통해 복사 할 객체가 전달한 값으로 멤버를 초기화합니다. 그런 다음 동일한 멤버에게 메모리를 할당하고 모든 것을 다시 복사합니다.
대부분의 경우 정크 데이터를 초기화되지 않은 포인터로 복사하고 있습니다. 이니셜 라이저 목록 :readArray(a.readArray),arraysize(a.arraysize)
을 제거하십시오.
이니셜 라이저 목록은 내가 얻었던 parasoft 오류 중 일부를 없애기 위해 수행되었습니다. –
@BrianPeach 이니셜 라이저 목록이 메모리 예외가 발생한 이유입니다. – Lundin
벡터를 사용하지 않고 std :: copy를 어떻게 사용합니까? (이 작업에 벡터를 사용할 수 없음)? 아까운 질문이 있으면 죄송합니다. –
수정 됨. BTW, initializer리스트의'readArray'가 복사 생성자에서 쓸모가 없다면 당신의 초기화가됩니다. - 당신은 그것을 본체에 덮어 씁니다. – Mat
그러나 2 개의 오류가 발생했습니다. 1. 오버로드 된 함수의 인스턴스가 없습니다. "std :: copy"는 인수 목록과 일치합니다. 2. 연산자 "+"는 다음 피연산자와 일치하지 않습니다. S –