2011-11-22 5 views
1

나는 C++ 프로그램을 작성하고 있습니다. 나는 파일을 파싱하고 구조를 초기화하고있다. 초기화 할 배열이 있지만 파일의 배열 크기를 읽어야합니다. 하나의 함수에서 배열 길이 읽기 및 배열 초기화를 원합니다. 배열 포인터를 다른 함수에 전달하고 함수를 반환하면 포인터가 삭제되고 초기화 된 값을 볼 수 없습니다. 이게 기대 되는가 아니면 뭔가 빠져있다. 이 문제를 어떻게 극복 할 수 있습니까?전달 된 인수에 대한 C++ 메모리 초기화

+3

당신은 표시해야합니다 당신의 어떤 대답을 얻기위한 코드 –

+0

실제로 문제를 보여주는 코드가 빠져있는 것 외에도 중간 부분을 이해하기가 어렵습니다. 당신은 통신 수'새로운'외침을하고 그 후에 무엇? – 0xC0000022L

+0

@STATUS_ACCESS_DENIED : 그는 액세스 거부 예외를받습니다! –

답변

7

수동 배열, 원시 포인터 전달 * 및 new에 대한 모든 것을 잊어 버림으로써이를 극복 할 수 있습니다. 이 그래서 C의 ++이 아니라 1991 년이며, 일반적인 해결책이 될 수있다 :

#include <vector> 
#include <cstdint> 
#include <istream> 

std::vector<uint32_t> read_data(std::istream & is) 
{ 
    uint32_t len; 
    is.read(reinterpret_cast<char*>(&len), sizeof(uint32_t)); 

    std::vector<uint32_t> result(len); 
    for (uint32_t i = 0; i != len; ++i) 
    { 
    is.read(reinterpret_cast<char*>(&result[i]), sizeof(uint32_t)); 
    } 

    return result; 
} 

(높은 품질의 코드에서 read 명령이 예외를 던져 가능성, 처리 될 조건 및 오류에 의해 포위 될 것이다 .)

나중에 :

#include "int_reader.hpp" 
#include <fstream> 
#include <iostream> 

int main() 
{ 
    std::ifstream infile("thedata.bin", std::ios::binary); 
    std::vector<uint32_t> data = read_data(infile); 

    std::cout << "We read " << data.size() << " integers.\n"; 
} 

*) 범용 C의 한 자리를 가지고있는 유일한 원시 포인터 ++ 코드에 의해 입증 된 바와 같이, I/O 작업에 사용하는 경우 char*이다. C++에서는 char을 머신의 기본 데이터 유닛 유형으로 정의하고 I/O는 char 단위로 발생합니다.

+0

나는 당신과 동의한다. 그러나 나는 C++에 대해 정말로 새롭고, 8 년 동안 C와 임베디드 시스템에서 일 해왔다. 나는 모든 것을 자기 손으로 쓰는 습관을 극복 할 시간이 필요하다. – Saba

+0

@ 사바 : 너 당신이 C++에서 웅변하기를 원한다면 확실히 C에 관한 거의 모든 것을 잊고 싶을 것입니다 :-) –

1

new을 호출하기 전에 배열 포인터가 없습니다. 따라서 함수에 전달할 수있는 방법은 없습니다.

배열 포인터의 초기화되지 않은 가비지 값을 함수에 전달하는 것일 가능성이 높습니다. 이 함수는 해당 가비지 값의 복사본을 new에서 반환 된 올바른 포인터로 덮어 씁니다. 그러나 원래 함수는 해당 포인터를 결코 보지 못합니다.

포인터에 포인터를 전달해야합니다. 그런 다음 new을 호출하면 포인터 포인터를 사용하여 호출자의 포인터를 업데이트 할 수 있습니다. 이처럼 :

void SomeFunction(void **SomePointer) 
{ 
    (*SomePointer) = malloc(1024); 
} 


void *MyPointer; 
SomeFunction(&MyPointer); 
+1

그리고 저는 Kerrek에 동의합니다. 이것은 일을하는 C 방법입니다. C++ 방식은 훨씬 좋네요. –

+0

'void *'를 역 참조 할 수 없거나'void **'에 별표가 누락 된 것을 제외하고는? – Pablo

+0

게시 한 지 약 2 초 후에 수정했습니다. 이런 식으로 코드를 작성하지 않는 또 다른 이유. ;) –

1

당신은 함수를 호출 할 수 당신

void allocateArrayOfT(T** objArray, size_t len) { 
    *objArray = new T[len]; 
} 

을 위해 할당해야하기 위해 포인터에 대한 포인터를 통과해야 :

T* arrayPtr; 
allocateArrayOfT(&arrayPtr, len); 
관련 문제