2011-02-10 2 views
2

이 코드는 VS2010 SP1의 정지 :냉동 감정

// STC_14_1.cpp : Defines the entry point for the console application. 
// 

//#include "stdafx.h" 
#include <exception> 
#include <iostream> 
#include <cstdlib> 
using std::cerr; 
using std::cout; 
using std::cin; 

void my_new_handler() 
{ 
    cerr << "Mem. alloc failed."; 
    std::exit(-1); 
} 
//std::unexpected_handler std::set_unexpected(std::unexpected_handler); 

class STC 
{ 
    std::new_handler old; 
public: 
    STC(std::new_handler n_h):old(std::set_new_handler(n_h)) 
    { } 

    ~STC() 
    { 
     std::set_unexpected(old); 
    } 

}; 

int main(int argc, char* argv[]) 
{ 
    STC stc(&my_new_handler); 
    while (true) 
    { 
     auto tmp = new int[50000]; 
    } 
    return 0; 
} 

그것이 내가 뭔가를 잘못하고 있어요하거나 VS의 문제라는 것이다을?

+0

STC : : ~ STC'? 디폴트'unexpected_handler'를 디폴트'new_handler'로 대체하는 것이 이상하게 보입니다. –

+0

@Charles 물론 아닙니다. 내 실수. –

+0

컴파일 할 때 컴파일러에게주는 옵션은 무엇입니까? –

답변

2

루프는 끝이 없다 :

while (true) 
    { 
     auto tmp = new int[50000]; 
    } 

당신은 루프의 외부를 종료하는 조건을 정의해야합니다. 카운터 파트에서 VS는 루프를 통해 반복 고정되고 힙에서 메모리를 소모합니다 (모든 반복에서 새 메모리 블록을 할당하므로).

편집 :이 void __cdecl로 정의되어야하기 때문에 귀하의 처리기가 호출되지 않습니다 처리기가 호출되지 않기 때문에

void __cdecl no_memory() { 
    cout << "Failed to allocate memory!\n"; 
    exit (1); 
} 

, 문제는 무한 루프입니다. 내 VS 2010에서 작동합니다.

+0

@Vladimir하지만이 루프를 시작하기 전에 new_handler가 설정되었음을 알고 있습니까? 추신 어떤 개인이 당신의 질문을 업 - 업 할 수 있습니까?) –

+0

-1 : 루프는 사용 가능한 모든 프로세스 메모리를 할당하여 예외 처리기가 호출되도록합니다. – Sebastian

+0

@Sebastian과 @There 우리가 할 수있는 것은 아무것도 없습니다. 처리기가 호출되지 않기 때문에 문제가 반복됩니다. 루프가 없으면 VS가 고정되지 않습니다. 저것과 같이 쉬운. 그러나 어쨌든 내 게시물을 편집하고 내 컴퓨터에서 작업하는 솔루션을 제안했습니다 (끝없는 반복에도 불구하고). 추신 그러나 우리가 할 수있는 일이있는 것 같습니다 :) – Vladimir

1

'정지'라고 말하면 코드가 실제로 실행 중이며 아직 새 처리기 코드에 충돌하지 않았는지 확인하십시오. MSDN here에서 예제 set_new_handler 코드를 실행 해 보았습니다. 아직 1 분 정도 걸리며 예제에서는 5000000이 아닌 5000000이 할당됩니다.

+0

gcc에 관한 내 코드는 mem을 소모하기 위해 3s 이하가 필요합니다. –

+0

실제로 디버그 버전을 실행하고있었습니다. 내 실수 :-) –

관련 문제