1
#ifndef UNICODE
#define UNICODE
#endif

#include <iostream>
#include <Windows.h>
#include <queue>


using namespace std;


void addSomeContent(queue<TCHAR*> &output)
{
    TCHAR* buffer;

    for(int i=0; i < 10000; i++)
        buffer = new TCHAR[1000];

}

int main()
{       
    queue<TCHAR*> foo;

    char sign;

beginning:

    addSomeContent(foo);

    while (!foo.empty())
    {
        delete [] foo.front();
        foo.pop();
    }

    wcout<<TEXT("Press y to repeat\n");
    cin>>sign;
    if(sign == 'y' || sign == 'Y') goto beginning;

    return 0;
}

このプログラムの各反復は、最大20MBのRAMを使用します。この命令でディスパッチされないのはなぜですか?

  while (!foo.empty())
  {
    delete [] foo.front();
    foo.pop();
  }
4

2 に答える 2

2

おそらく、への参照を渡し、fooそれaddSomeContentaddSomeContentという名前の変数として使用している間outputaddSomeContentはすべての種類のメモリを割り当てていますが、それらの割り当てをに配置することはないoutputため、メインに戻るfooと空になります。

SOでは私たちは助けになりたいと思っていますが、私たちは本当に人々が最初に自分自身を助けようとすることを望んでいます。投稿する前に少しデバッグを行った場合、これはあなたが自分で見つけた単純な問題です。

于 2012-10-07T13:07:44.063 に答える
0

delete[]手動でメモリを作成しようとしています。これは常に悪いことです。std::queue<std::vector<TCHAR>>代わりに使用してください。またgoto?これは悪いことであり、あなたは気分が悪いはずです。

キューにアイテムを追加する場合は、そのアイテムのメンバー関数を呼び出す必要があります。

次のコードは実際に機能する可能性があり、それを見ている人を狂気に駆り立てない可能性があります。

void addSomeContent(std::queue<std::vector<TCHAR>> &output)
{
    for(int i=0; i < 10000; i++)
        queue.push_back(std::vector<TCHAR>(1000));
}

int recursive_main() {
    std::queue<std::vector<TCHAR>> foo;
    addSomeContent(foo);
    while(!foo.empty()) foo.pop(); // no need to delete
    std::wcout << L"Press y to repeat\n";
    char sign;
    std::cin >> sign;
    if (sign == 'y' || sign == 'Y') return recursive_main();
    return 0;
}

int main()
{       
    return recursive_main();
}
于 2012-10-07T13:09:55.633 に答える