2012-09-30 50 views
0

下面的代碼在未註釋時崩潰,看起來get()中的shared_array參數有問題。傳遞shared_array <T>參數

打印()似乎並沒有崩潰,至少現在...

什麼是傳遞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]); 
    ... 
} 

回答

5

的問題是在該行:

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

shared_array要求的指針數組與新[]但的argv [1]僅是一個C-串分配被初始化,所以當它超出範圍(變量參數是)時,shared_array的析構函數調用argv [1]上的delete [],這是不允許的。