Thomi
그는 물었다 12년 전
26

객체를 만들지 않도록 하는 방법을 힙에서의?

내가 할 수 있는 방법을 아는 사람, 플랫폼에 C++ 코드를 작성하는 것을 에서 객체를 힙에서의? 즉,, 이렇게 할 수 없게 하려면 클래스에 대한 &quot Foo&quot 싶습니다.

Foo *ptr = new Foo;

유일한 이 작업을 수행할 수 있게 해준다.

Foo myfooObject;

누구 뭐 좋은 방법이 없을까요?

건배,

답변 9 개

[# 39 의 Nick& 오토메이티드] (https://stackoverflow.com/questions/10985/how-to-prevent-an-object-being-created-on-the-heap # 11003) 은 불완전한 상태로 할 때 좋은 출발점이 실제로 오버로드할:

private:
    void* operator new(size_t);          // standard new
    void* operator new(size_t, void*);   // placement new
    void* operator new[](size_t);        // array new
    void* operator new[](size_t, void*); // placement array new

(좋은 코딩 연습 제시할 것이라고 할 수도 있습니다 오버로드할 삭제 및 삭제입니다 [] 연산자 - 꼭 이래야겠어요, 그러나 they& # 39, re not going , t 정말 필요한 isn& afaq # 39 라고도 했다.)

[파울두] (https://stackoverflow.com/questions/10985/how-to-prevent-an-object-being-created-on-the-heap # 11018) 도 있지만, 이 t survivetm 묶어 수정하십시오 doesn& # 39 에서 유일한 Foo 않니다 survivetm Foo. 이를 방지하기 위해 일부 템플리트를 할 수 있지만, 면역력을 지닌 메타 프로그래밍 매직 &quot 이글거리 users&quot 않을 것이라고 말했다. 그리하여 가치가 합병증 가능성이 거의 없다. 설명서를 제대로 사용할 수 있도록 어떻게 하는지, 사용되는 코드 리뷰 ~ 100% 밖에 없다.

Community
kevinarpe
그는 4년 전 댓글을 달았습니다
1

팩토리 메서드 (반품하십시오 by value) 달성할 것이라고 함께 개인 구성자를 공용 정적 유지됩니까?

Patrick Johnmeyer
그는 4년 전 댓글을 달았습니다
1

39 는 말 그대로, re 판독값 질문이예요 we& @kevinarpe 이 방법에 따라 달라집니다. 정확한 코드 ',' 에서 볼 수 있는 경우 재발했지 컴파일하십시오 Foo 마이포로비치 않을 것이라고 말했다. 즉, 만약 제가 하고 있는 내가 포지셔닝하십시오 외곽진입 더 가깝지 뭘 어떻게 객체에는 컨트롤입니다 생성될지 제안하고 있습니다.

Brian
그는 2년 전 댓글을 달았습니다
1

참고로 이 새로운 '회피' 대신 '새' 로 사용할 수 있는 '새' 를 수행할 조회를 연산자입니다 글로벌 내시경이요

Foo 의 새로운 저회가 전용으로 오버로드할 수 있습니다. 이는 컴파일러를 신음 소리 한다는 것을 의미하는 것이다. # 39 에서 Foo 의 인스턴스를 만드는 경우를 제외하고, re you& 힙에서의 Foo. 이 경우 단순히 Foo& # 39 을 잡을 수 없는 새로운 방법을 쓸 수 있습니다 다음 링커 신음 소리 정의되지 않은 심볼에는 대한 것이다.

class Foo {
private:
  void* operator new(size_t size);
};

PS, 예, 회피 그러니까말이야 쉽게 확인할 수 있습니다. # 39 이라는 it& i&, m, s # 39 이 나쁜 아이디어 진짜 안 것 같아요 - - 난 그냥 하고 질문! -)

39 t know how to do it, i don& 안정적으로 또한 이동형이든지 것입니다. 하지만.

Stack 객체인지 경우 그 안에 있는 & # 39 구성자를 어설션 수 있는 가치를 this& # 39;; 항상 가까운 스택할 포인터입니다. # 39 의 there& 될 수 있는 좋은 기회를 객체에는 stack 이 경우.

내가 믿는 것은 그들의 모든 플랫폼에 같은 방향으로 스택 구현하십시오 단일 앱 테스트 할 수 있도록 할 때 전혀 확인할 방법이 스택할 증가하고 있습니다. 아니면 일부 잃어버린:

FooClass::FooClass() {
    char dummy;
    ptrdiff_t displacement = &dummy - reinterpret_cast<char*>(this);
    if (displacement > 10000 || displacement < -10000) {
        throw "Not on the stack - maybe..";
    }
}

pauldoo
Vargas
그는 10년 전 댓글을 달았습니다
0

아무리 아니라고 생각한다 및 더미 항상 서로 가까이 있는 경우 또는 스택할 힙

pauldoo
그는 10년 전 댓글을 달았습니다
1

I @vargas 전혀 그렇지 않다. # 39, & # 39 dummy&. 항상 stack, 이기 때문에 자동 로컬 변수. 이 '수' 를 스택 포인터를 인컨텍스트 가리키십시오 경우 반드시 포클레스 로컬 변수) 또는 힙 (만약 포클레스 는 할당할지 힙에서의 클래스, 또는 그 안에 묶어 원하는거요 할당할지 힙에서의).

Vargas
그는 10년 전 댓글을 달았습니다
0

허긴, 그냥 더미 '착각' 의 멤버 변수. 죄송합니다

@ [닉] (# 11003)

회피 또는 취합합니다 파생시킵니다 Foo 의 클래스를 만들어 될 수 있습니다. 내 생각엔 내가 제안하세요 (아니지만 강력한) 및 통합 클래스뿐만 파생됨 여전히 일하고 있습니다.

E. g:

struct MyStruct {
    Foo m_foo;
};

MyStruct* p = new MyStruct();

39, & # 39, 나는 여기서 hotenough. 인스턴스입니다 Foo& # 39 의 감춰집니다 Foo& 힙에서의 거치지 않고, 새로운 모습이다.

pauldoo
Viet
그는 7년 전 댓글을 달았습니다
0

+1 좋은 트릭! 유형 캐스팅 역시 도움이 될 수 있습니다.

디버그로 수 있기 때문에, 새로운 서명입니다 오버라이드합니다 헤더도 연산자에서 사용하는 것이 가장 좋습니다. 서명 완료하십시오 해결할 수 있다.

private:
void* operator new(size_t, ...) = delete;
void* operator new[](size_t, ...) = delete;

이 막을 수 있는 개인 및 서비스를 제공함으로써 구성자를 만들어 물체를 만드는 정적 멤버 스택할

Class Foo
{
    private:
        Foo();
        Foo(Foo& );
    public:
        static Foo GenerateInstance() { 
            Foo a ; return a; 
        }
}

이 객체의 생성 발쿰치로 항상 스택의.

이를 통해 직접 구축 강의 및 제어할 수 있다면 더 너희가운데 인터페이스입니다 자신의 코드를.

함수를 선언하는, 작동자 new&quot &quot 불렀으매 수 있습니다. 블록 안에서 Foo 클래스용 액세스하려면 되는 일반적인 형태의 새로운.

이런 행동을 로만스였나 운영까지도?

이 경우 모든 기회를 가질 수 있는지 알고 있지만, & # 39 는 컴파일 타임 new& # 39 부담을 주지 바라볼 수 있습니다. 작동자 클래스에 대한?