나는 C++ 프로그램을 작성하고 있습니다. 나는 파일을 파싱하고 구조를 초기화하고있다. 초기화 할 배열이 있지만 파일의 배열 크기를 읽어야합니다. 하나의 함수에서 배열 길이 읽기 및 배열 초기화를 원합니다. 배열 포인터를 다른 함수에 전달하고 함수를 반환하면 포인터가 삭제되고 초기화 된 값을 볼 수 없습니다. 이게 기대 되는가 아니면 뭔가 빠져있다. 이 문제를 어떻게 극복 할 수 있습니까?전달 된 인수에 대한 C++ 메모리 초기화
답변
수동 배열, 원시 포인터 전달 * 및 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
단위로 발생합니다.
나는 당신과 동의한다. 그러나 나는 C++에 대해 정말로 새롭고, 8 년 동안 C와 임베디드 시스템에서 일 해왔다. 나는 모든 것을 자기 손으로 쓰는 습관을 극복 할 시간이 필요하다. – Saba
@ 사바 : 너 당신이 C++에서 웅변하기를 원한다면 확실히 C에 관한 거의 모든 것을 잊고 싶을 것입니다 :-) –
new
을 호출하기 전에 배열 포인터가 없습니다. 따라서 함수에 전달할 수있는 방법은 없습니다.
배열 포인터의 초기화되지 않은 가비지 값을 함수에 전달하는 것일 가능성이 높습니다. 이 함수는 해당 가비지 값의 복사본을 new
에서 반환 된 올바른 포인터로 덮어 씁니다. 그러나 원래 함수는 해당 포인터를 결코 보지 못합니다.
포인터에 포인터를 전달해야합니다. 그런 다음 new
을 호출하면 포인터 포인터를 사용하여 호출자의 포인터를 업데이트 할 수 있습니다. 이처럼 :
void SomeFunction(void **SomePointer)
{
(*SomePointer) = malloc(1024);
}
void *MyPointer;
SomeFunction(&MyPointer);
그리고 저는 Kerrek에 동의합니다. 이것은 일을하는 C 방법입니다. C++ 방식은 훨씬 좋네요. –
'void *'를 역 참조 할 수 없거나'void **'에 별표가 누락 된 것을 제외하고는? – Pablo
게시 한 지 약 2 초 후에 수정했습니다. 이런 식으로 코드를 작성하지 않는 또 다른 이유. ;) –
당신은 함수를 호출 할 수 당신
void allocateArrayOfT(T** objArray, size_t len) {
*objArray = new T[len];
}
을 위해 할당해야하기 위해 포인터에 대한 포인터를 통과해야 :
T* arrayPtr;
allocateArrayOfT(&arrayPtr, len);
- 1. performSelectorOnMainThread의 withObject 인수에 대한 네이티브 포인터 전달?
- 2. 함수에 초기화 된 구조체에 대한 포인터를 전달
- 3. C++ 한 인수에 여러 인수 전달
- 4. Scala의 인수에 함수 전달
- 5. 키워드 인수에 전달
- 6. 메모리 맵을 사용하여 할당 된 메모리 전달
- 7. 파이썬에서 인수에 대한 기본 값으로
- 8. 공유 메모리 초기화 문제 (c)
- 9. objective-c 메모리 관리 환경의 초기화 자
- 10. C 초기화 된 struct를 임베디드 루비 인터프리터에 전달
- 11. Obj-C : 다른 클래스의 초기화 된 클래스에 포인터 전달
- 12. CakePHP에서 명명 된 인수에 대한 경로 설정
- 13. C++ 주 외부 명령 줄 인수에 대한 액세스?
- 14. 은 isEqualToString의 인수에 대한
- 15. 컴파일러 관련 메모리 초기화
- 16. python3은 sorted()의 "key"인수에 전달 된 메서드로 무엇을합니까?
- 17. raw 포인터 인수에 대한 shared_ptr
- 18. will_paginate 인수에 대한 이해
- 19. Go 프로그램에 전달 된 명령 줄 인수에 액세스하는 방법?
- 20. objective-c 클래스 초기화 메소드의 메모리 누수
- 21. 메모리 버퍼에서 C++ std :: istringstream을 초기화 하시겠습니까?
- 22. C++ 초기화 목록 및 메모리 할당
- 23. UIStoryboardSegue로 초기화 된 UIViewController에 대한 popViewController
- 24. 파이썬 함수 인수에 대한 명명법
- 25. 서명이있는 인수에 대한 기본적인 질문 void * data
- 26. sizeof 인수에
- 27. 생성자 java/C# 인수에 mother 클래스를 사용합니다.
- 28. C++에서 "std :: string &"형식의 인수에 대한 기본값을 지정하면 메모리 누수가 발생할 수 있습니까?
- 29. 객관적인 C 초기화 작업
- 30. 초기화 전에 개체를 생성자에 전달
당신은 표시해야합니다 당신의 어떤 대답을 얻기위한 코드 –
실제로 문제를 보여주는 코드가 빠져있는 것 외에도 중간 부분을 이해하기가 어렵습니다. 당신은 통신 수'새로운'외침을하고 그 후에 무엇? – 0xC0000022L
@STATUS_ACCESS_DENIED : 그는 액세스 거부 예외를받습니다! –