以下代码在取消注释时崩溃,似乎shared_array<> get()中的参数是有问题的。
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]);
...
}
答案 0 :(得分:5)
问题在于:
shared_array<wchar_t> param(argv[1]);
shared_array需要使用指向new []分配的数组的指针进行初始化,但是argv [1]只是一个c字符串,所以当它超出范围(变量param)时,shared_array的析构函数调用delete argv [1]上的[]是不允许的。