よくわからないところでエラーが出る

これこれ。

// 0-5 で切り替え
#define SW 0

// WM_PAINT メッセージを受け取った時に実行される関数
// その他の部分は省略
void OnPaint(HWND hWnd)
{
	HDC hdc;
    PAINTSTRUCT pt;
    TEXTMETRIC tm;
    int len=0, line = 0;
    int x = 10;
    int y = 10;
#if   SW == 0
    LPSTR lpStr = TEXT("            _\n\n");    // パターン 0 : これだと駄目
#elif SW == 1
    LPSTR lpStr = TEXT("            .\n\n");    // パターン 1 : これならいける
#elif SW == 2
    LPSTR lpStr = TEXT("            _\n");      // パターン 2 : これでもいける
#elif SW == 3
    LPSTR lpStr = TEXT("           _\n\n");     // パターン 3 : これすらいける
#elif SW == 4
    LPSTR lpStr = TEXT("             _\n\n");   // パターン 4 : もちろんこれも
#else
    LPSTR lpStr = TEXT("\n\n           _");     // パターン 5 : ついでにこれも
#endif
    
    hdc = BeginPaint(hWnd, &pt);
    
    for(int i=0; true; i++) {
        if(lpStr[i] == '\n' || lpStr[i] == NULL) {
            LPSTR text = new char[sizeof(lpStr)];
            wsprintf(text, "%s", lpStr +i -len);
            text[len] = NULL;
            
            GetTextMetrics(hdc, &tm);
            TextOut(hdc, x, y +tm.tmHeight *line, text, len);
            
#if SW == 0
MessageBox(NULL, TEXT("ここまでは来るよ"), TEXT("NEST :: laboratory"), MB_OK);
#endif
            delete text;    // ←ここでエラーが出る
#if SW == 0
MessageBox(NULL, TEXT("ここまでは来ないよ"), TEXT("NEST :: laboratory"), MB_OK);
#endif
            
            len = 0;
            line++;
            
            if(lpStr[i] == NULL)
                break;
        } else {
            len++;
        }
    }
    
    EndPaint(hWnd, &pt);
    
    return;
}

APITextOut() だと一行しか描画できないので、文字列中の改行 '\n' を自動的に判断して分割して出力する関数を自作中に出会った不具合。12 byte 目にアンダースコアだとかハイフンだとかを入れて、後ろで二つ以上改行すると、何故か delete でエラーが発生する。なんだそりゃ。
あー関係ないけど、余分にバッファつくって対象文字列の後ろに '\n' をくっつけるような処理にした方がシンプルな for 文になりそうな気がする。