문제

내가 할 수있는 전화가 있습니까? new 메모리를 제로로 만들기 위해 calloc?

도움이 되었습니까?

해결책

일부 사람들이 그들의 답변에서 말하는 것과 반대로, 그것은 ~이다 가능한.

char * c = new char[N]();

모든 문자를 초기화 할 것입니다 (실제로는 가치 개시화라고합니다. 그러나 가치 개시화는 스칼라 유형 배열의 모든 멤버에 대해 제로 시작)가 될 것입니다). 그것이 당신이 추구하는 것이라면.

사용자 선언 된 생성자가없는 클래스 유형 (배열)도 작동한다는 점에 유의하십시오.

struct T { int a; };
T *t = new T[1]();
assert(t[0].a == 0);
delete[] t;

확장이나 무언가가 아닙니다. C ++ 98에서도 같은 방식으로 작동하고 행동했습니다. 값 초기화 대신 기본 초기화라고 불렀습니다. 그러나 스칼라 또는 스칼라 또는 포드 유형의 스칼라 또는 배열의 경우 두 경우 모두 초기화 제로화가 수행됩니다.

다른 팁

아니요. 그러나 Calloc과 같은 새로운 버전을 만드는 것은 매우 쉽습니다. 새로운 버전의 New 버전이 구현되는 것과 거의 같은 방식으로 수행 할 수 있습니다.

somefile.h

struct zeromemory_t{};
extern const zeromemory_t zeromemory;
void* __cdcel operator new(size_t cbSize, const zeromemory_t&);

somefile.cpp

const zeromemory_t zeromemory;

void* _cdecl operator new(size_t cbSize, const zeromemory_t&)
{
    void *mem = ::operator new(cbSize);
    memset(mem,0,cbSize);
    return mem;
}

이제 제로 메모리로 새로운 것을 얻기 위해 다음을 수행 할 수 있습니다.

MyType* pMyType = new (zeromemory) MyType();

또한 새로운 []를 정의하는 것과 같은 다른 재미있는 일을해야합니다.

아니요. 또한 다음과 같은 일을 생각조차하지 않습니다.

YourClass *var = new YourClass;
memset(var, 0, sizeof(YourClass));

당신은 당신의 vtable을 쓰레기로 만들 수 있습니다 (수업에 하나가있는 경우).

생성자를 사용하여 클래스의 내부 메모리 (변수)를 지우는 것이 좋습니다.

아니요. 원시인의 경우 아무것도하지 않는 할당 된 항목을 기본적으로 기본적으로 기본화합니다. std :: uninitialized_fill_n 호출 또는 이와 유사하게 따라야합니다.

글로벌 오버로드를 할 수 있습니다 new 그리고 원시 메모리를 잡으십시오 calloc(). 이런 식으로 생성자가 실행되기 전에 메모리가 지워지므로 문제가 없습니다.

자체적으로 새로운 수업을받는 모든 수업 calloc()-기반을 둔 new, 그러나 그 수업은 어쨌든 올바르게 초기화해야합니다.

두 가지를 무시하는 것을 잊지 마십시오 new 그리고 delete 그리고 배열 버전 ...

같은 것 :

#include <exception> // for std::bad_alloc
#include <new>
#include <stdlib.h> // for calloc() and free()

void* operator new (size_t size)
{
 void *p=calloc(size, 1); 
 if (p==0) // did allocation succeed?
  throw std::bad_alloc(); 
 return p;
}


void operator delete (void *p)
{
 free(p); 
}

void* operator new[] (size_t size)
{
 void *p=calloc(size, 1); 
 if (p==0) // did allocation succeed?
  throw std::bad_alloc();
 return p;
}

void operator delete[] (void *p)
{
 free(p); 
}

이 간단한 버전은 정확히 무엇이되어야하는지에 유의하십시오. new 운영자는 전화를 호출하는 루프로 실행해야합니다 new_handler (하나가 설치된 경우) bad_alloc 아니오가있는 경우 예외 new_handler. 아니면 그런 것, 나는 그것을 찾아 나중에 업데이트해야 할 것이다.

아, 그리고 당신은 또한 no_throw 버전도.

나는 매크로를 사용합니다.

#define newclear(TYPE) new(calloc(sizeof(TYPE), 1)) TYPE();

그것을 사용하려면 :

Whatever* myWhatever = newclear(Whatever);

(여기서 다른 솔루션과 마찬가지로 "Placement New"를 사용합니다)

아니요. 메모리를 수동으로 제로로 제로해야합니다. 기억하다, new 메모리를 할당하는 것뿐만 아니라 생성자를 통해 초기화하는 것입니다. 이것은 어디에 있습니다 calloc C에서 편리합니다 (초기화 기능이 없음). 래퍼를 자유롭게 쓸 수 있습니다 new 또는 사용 calloc, 그러나 대부분의 시간이 아닌 객체의 경우 대부분은 의미가 없습니다.

사용하지 않는 경우 new, 당신은 단순히 벡터를 사용할 수 있습니다 : vector<char> buffer; buffer.resize(newsize); 그리고 내용은 제로화됩니다.

class MyClass {
    public:
    void* operator new(size_t bytes) {
        return calloc(bytes, 1);
    }
}

원하는 경우 글로벌 신규 운영자를 무시할 수 있습니다.

당신은 말할 수 있습니다 :

vector <char> v( 100, 0 );

새로운 것을 사용하여 100 자의 인접한 배열을 생성하고 모두 0으로 초기화합니다. 그런 다음 벡터의 [] 연산자로 배열에 액세스하거나 다음을 수행 할 수 있습니다.

char * p = &v[0];
p[3] = 42;

이것은 또한 할당 된 메모리를 제거하기 위해 삭제를 호출하지 않아도됩니다.

예.

int* p_scalar = new int(5);//Does not create 5 elements, but initializes to 5

배열의 경우 Memset과 같은 것을 사용할 수 있습니다. Windows의 경우 Zeromemory 또는 Securezeromemory를 사용하십시오.

편집하다: @litb의 게시물을 참조하십시오. 위와 같이 비 직접 초기화를 사용하여 배열에 대해 0으로 초기화하는 방법을 보여줍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top