传递shared_array <T>参数

Jef*_*nes 0 c++ boost pointers shared-ptr

下面的代码在取消注释时崩溃,似乎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()); 
}
Run Code Online (Sandbox Code Playgroud)

编辑:谢谢.所以关键在于我在使用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);
}
Run Code Online (Sandbox Code Playgroud)

实际上起初我在堆栈中分配了paramBuf,所以我找不到错误.

WRONG:    
int wmain(...) {
    wchar_t paramBuf[100];
    wcscpy_s(paramBuf, 100, argv[1]);
    ...
}
Run Code Online (Sandbox Code Playgroud)

mau*_*uve 5

问题在于:

shared_array<wchar_t> param(argv[1]);
Run Code Online (Sandbox Code Playgroud)

shared_array需要使用指向new []分配的数组的指针进行初始化,但是argv [1]只是一个c字符串,所以当它超出范围(变量param)时,shared_array的析构函数调用delete [] on argv [1]是不允许的.