2013-09-04 3 views
0

const 참조 및 포인터별로 한 번씩 요소를 내 모음에 추가하는 두 가지 방법을 제공합니다.할당 및 스택 메모리 처리

void push_back(const value_type *val) { 
    element *elem = new element(val); 
    //... 
} 
void push_back(const value_type &val) { 
    push_back(&val); 
} 

element 클래스는 값을 포인터로 유지합니다.

분명히 요소가 팝되거나 콜렉션이 삭제되면 요소가 포인터로 추가되면 메모리를 해제해야합니다. 그러나 요소를 수동으로 할당하지 않고 참조로 전달할 때 오류가 발생합니다.

요소가 push_back 시간에 동적으로 할당 된 경우를 저장하는 것보다이 문제를 해결할 수있는 다른 옵션이 있습니까?

+6

코드를 올바르게 이해하면 'push_back (const value_type &)'가 문제를 묻는 중입니다. 내가 이렇게하면 어떡하지? '{value_type a; collection.push_back (a); }''collection' 객체는 스코프의 끝에서'a'가 파괴되면 매달려있는 포인터를 가지고 끝납니다. ** 이미이 문제로 인해 끔찍한 디자인입니다. ** "객체가 스택 또는 힙에 있는지 여부에 관계없이 전체적으로"매우 다른 작업을 수행하는 것에 대해서도 언급하지 않았습니다. –

+0

@Macmade 여러 요소가 같은 요소를 가리 키도록해야하는데 동적으로 병합하고 조각화해야합니다. – Appleshell

+0

@Insilico 보류 된 변수는 범위 끝에서 삭제되지 않습니다. – Appleshell

답변

1

일관되고 항상 삭제할 수있는 포인터를 저장하십시오.

void push_back(const value_type &val) { 
    push_back(new value_type(val)); 
} 
1

일반적으로 결함이있는 디자인입니다. 또한 필요한 것을 얻기 위해 디자인을 변경할 수있는 여러 가지 방법이 있습니다. Mark의 대답은 그에 대한 간단한 설명입니다 (예 :).

그런데, 당신의 디자인을 사용하여 가능한 해결책이 있습니다. 다시 한번, 은 컴파일러가 스택을 빌드하는 방법의 내부 구조에 의존하며 컴파일러/플랫폼간에 이식 할 수 없으므로 권장하지 않습니다.

기본적으로 ~element()에서 value에 저장된 주소가 현재 스택 포인터와 비교하여 스택 또는 힙에 있는지 확인할 수 있습니다. value에 저장된 주소가 스택 포인터보다 높으면 스택에 있으므로 삭제해서는 안됩니다 (주소 공간의 맨 위에 스택의 일반적인 위치가 제공됨). 스택 포인터보다 작 으면 힙에 있습니다. 하여 주소의 관계를 설명하기

코드 (GCC를, 64 리눅스) :

#include <iostream> 

int main() 
{ 
int * heap_(new int(0)); 
int stack_(0); 
void * rsp_(nullptr); 

asm("mov %%rsp, %0" : "=m" (rsp_)); 

std::cout << "heap address\t: " << heap_ 
      << "\nstack address\t: " << &stack_ 
      << "\nstack pointer\t: " << rsp_ << std::endl; 

delete (heap_); 

return (0); 
} 

프로그램 출력 :

heap address : 0xc52010 
stack address : 0x7fff528ffee4 
stack pointer : 0x7fff528ffee0 

ideone.com는 GCC에 대한 액세스를 제공하지만 86 버전을 사용 - esprsp 대신 등록하십시오. The code has to be changed (이식 불가).