0

以下のコードは、コメントを外すとクラッシュし、get() の shared_array<> 引数に問題があるようです。

print() は、少なくとも今のところクラッシュしていないようです...

shared_array<> 引数を渡す正しい方法は何ですか?

#include <iostream>
#include <cstring>
#include <boost/shared_array.hpp>
using namespace std;
using namespace boost;

shared_array<wchar_t> get(const wchar_t* s) {
//shared_array<wchar_t> get(const shared_array<wchar_t>& s) {

    size_t size = wcslen(s);
    //size_t size = wcslen(s.get());

    shared_array<wchar_t> text(new wchar_t[size+1]);

    wcsncpy(text.get(), s, size+1);
    //wcsncpy(text.get(), s.get(), size+1);

    return text;
}

void print(shared_array<wchar_t> text) {
    wcout << text.get() << endl;
}

int wmain(int argc, wchar_t *argv[]) {
    //shared_array<wchar_t> param(argv[1]);

    shared_array<wchar_t> text = get(argv[1]);
    //shared_array<wchar_t> text = get(param);

    print(text);
    //print(text.get()); 
}

編集:ありがとう。したがって、ここで重要な点は、boost::shared_ptr/array を使用するときは常に new/new[] のみを使用する必要があるということです。

主な機能が修正されました:

int wmain(int argc, wchar_t *argv[]) {
    size_t szArg = wcslen(argv[1]);
    wchar_t* paramBuf = new wchar_t[szArg+1];
    wcscpy_s(paramBuf, szArg+1, argv[1]);
    shared_array<wchar_t> param(paramBuf);

    shared_array<wchar_t> text = get(param);

    print(text);
}

実は最初は paramBuf をスタックに割り当てていたので、間違いを見つけることができませんでした。

WRONG:    
int wmain(...) {
    wchar_t paramBuf[100];
    wcscpy_s(paramBuf, 100, argv[1]);
    ...
}
4

1 に答える 1

5

問題は次の行にあります。

shared_array<wchar_t> param(argv[1]);

shared_arrayは、new []で割り当てられた配列へのポインターで初期化する必要がありますが、argv [1]は単なるc文字列であるため、スコープ(つまり変数param)から外れると、shared_arrayのデストラクタはdelete[]を呼び出します。許可されていないargv[1]。

于 2012-09-30T13:35:09.620 に答える