Sma*_*ash 2 c++ templates vector
这是一个小函数,我正在尝试编写以跟踪我在函数中使用的动态分配(厌倦了一直编写delete []).
template <class T>
T* snew(int size, vector<T*> list)
{
T* pointer = new T[size];
list.push_back(pointer);
return pointer;
}
vector<float*> list;
float* myfloat1 = snew<float*>(HEIGHT*WIDTH,list);
float* myfloat2 = snew<float*>(HEIGHT*WIDTH,list);
float* myfloat3 = snew<float*>(HEIGHT*WIDTH,list);
Run Code Online (Sandbox Code Playgroud)
那么当我需要清除内存时我可以使用:
template <class T>
void sdelete(vector<T*> list)
{
vector<T*>::iterator it;
for (it = list.begin(); it != list.end(); ++it){
delete [] *it
*it = NULL
}
}
Run Code Online (Sandbox Code Playgroud)
像这样:
sdelete<float*>(list);
Run Code Online (Sandbox Code Playgroud)
当我尝试编译时,我得到:
cannot convert parameter 2 from 'std::vector<_Ty>' to 'std::vector<_Ty,_Ax>'
Run Code Online (Sandbox Code Playgroud)
不确定这意味着什么.感谢您的见解:)
首先,您通过vector<T*> list值传递,这意味着它被复制并且您的全局list保持不变.
像这样做:
template <class T>
T* snew(int size, vector<T*>& list)
Run Code Online (Sandbox Code Playgroud)
至于编译问题,有一个错字,你应用*一次太多,改变用法
float* myfloat1 = snew<float>(HEIGHT*WIDTH,list);
sdelete<float>(list);
Run Code Online (Sandbox Code Playgroud)
或者你甚至可以依赖编译器的类型推断而只是写
float* myfloat1 = snew(HEIGHT*WIDTH,list);
sdelete(list);
Run Code Online (Sandbox Code Playgroud)
但这个想法作为一个整体是非常糟糕的,因为如果你已经vector有了,你不想new/delete手工做.只需创建vector<float> x(HEIGHT*WIDTH);并使用它,它就会自动删除.
| 归档时间: |
|
| 查看次数: |
3418 次 |
| 最近记录: |