我已经从DirectX获得了一个存储我的顶点信息的存储位置。处理顶点信息的一种极为方便的方法是使用包含顶点信息的结构的std::vector 。鉴于我有一个指向大缓冲区的指针,是否可以使用std::vector来管理缓冲区中的元素?定期构造std::vector使其具有自己的地址,这并不是我真正想要的。我可以以某种方式使用新的运算符放置吗? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 是的你可以。使用custom allocator。在此分配器中,您的DirectX内存的返回地址。这是一个完整的示例,基于Compelling examples of custom C++ STL allocators?的答案。此解决方案在分配器中使用new放置。#include <memory>#include <iostream>#include <vector>using namespace std;template <typename T>class placement_memory_allocator: public std::allocator<T>{ void* pre_allocated_memory;public: typedef size_t size_type; typedef T* pointer; typedef const T* const_pointer; template<typename _Tp1> struct rebind { typedef placement_memory_allocator<_Tp1> other; }; pointer allocate(size_type n, const void *hint=0) { char* p = new(pre_allocated_memory)char[n * sizeof(T)]; cout << "Alloc " << n * sizeof(T) << " bytes @" << hex << (void*)p <<endl; return (T*)p; } void deallocate(pointer p, size_type n) { cout << "Dealloc " << n << " bytes @" << hex << p << endl; //delete p; } placement_memory_allocator(void* p = 0) throw(): std::allocator<T>(), pre_allocated_memory(p) { cout << "Hello allocator!" << endl; } placement_memory_allocator(const placement_memory_allocator &a) throw(): std::allocator<T>(a) {pre_allocated_memory = a.pre_allocated_memory;} ~placement_memory_allocator() throw() { }};class MyClass{ char empty[10]; char* name;public: MyClass(char* n) : name(n){ cout << "MyClass: " << name << " @" << hex << (void*)this << endl; } MyClass(const MyClass& s){ name = s.name; cout << "=MyClass: " << s.name << " @" << hex << (void*)this << endl; } ~MyClass(){ cout << "~MyClass: " << name << " @" << hex << (void*)this << endl; }};int main(){ // create allocator object, intialized with DirectX memory ptr. placement_memory_allocator<MyClass> pl(DIRECT_X_MEMORY_PTR); //Create vector object, which use the created allocator object. vector<MyClass, placement_memory_allocator<MyClass>> v(pl); // !important! reserve all the memory of directx buffer. // try to comment this line and rerun to see the difference v.reserve( DIRECT_X_MEMORY_SIZE_IN_BYTES / sizeof(MyClass)); //some push backs. v.push_back(MyClass("first")); cout << "Done1" << endl; v.push_back(MyClass("second")); cout << "Done1" << endl; v.push_back(MyClass("third")); cout << "Done1" << endl;} (adsbygoogle = window.adsbygoogle || []).push({});