托管代码中使用的STL向量
STL vector used in managed code
OS: xp
IDE: VS 2008
在我在visual c++中做的项目中,我已经在管理类中声明了一个std::vector
,如下
std::vector<pts> dataPoints;//this gives error c4368 : mixed type not allowed
但这是有效的
std::vector<pts> * dataPoints;//a pointer to the vector
则在自由存储区上创建了这个vector,就像在托管类
的构造函数中创建的那样。dataPoints = new std::vector<pts>(noOfElements,pts());//which is not so attractive.
我需要向量的原因是因为我正在读取ifstream
并将这些值存储在向量中的文件。
Q1)为什么我能够声明一个指针原生类型的对象(我猜),但不是一个对象?此外,在尝试vector之前,我尝试了托管数组
cli::array<Point> dataPoints //and i defined it later.
但是当我这样做时
ifile >> dataPoints[i].X;
给出了一个错误c2678: operator=没有重载int
!!
Q2)为什么我不能在这里使用托管代码?起初我认为它可能是一个包装类Int,但随后自动装箱(转换操作符)应该照顾它?还是点::X是合格的property
,因此不被认为是正常的int
?我错过了什么?这就是我选择vector
和pts
方案的原因。pts
如下
struct pts
{
int X, int Y;
pts() : X(0),Y(0){}
pts(int x,int y) : X(x),Y(y){}
};//this i created to store the data from the file.
托管类对象的一个重要属性是它们会被垃圾收集器移动。这发生在它压缩堆的时候。这对本地c++对象造成了严重破坏,指向其成员的指针将变得无效。因此,作为规则,编译器禁止在托管对象中嵌入本机非pod对象。指针不是问题
在使用>>
操作符时也存在完全相同的问题。int通过引用传递给操作符>>()。如果垃圾收集器恰好在代码接受int的引用和调用操作符之间启动,灾难就会发生。一个简单的解决方法是通过一个局部变量执行中间步骤:
int x;
ifile >> x;
dataPoint[i].X = x;
这是有效的,因为局部变量是稳定的,不受垃圾收集的影响。
这些在本机代码中都不是问题。请记住,ref类可以很容易地调用本机函数。因此,将两者分开可能是有用的,或者是必要的。
不能在托管类型中直接包含本机类型:这只是c++/CLI的一个限制。我认为这可能与本机类型内指针的可能性有关。如果本机类型直接在托管类型中,那么当托管对象在垃圾收集期间被打乱时,这些指针将指向原始的、现在不正确的内存。
因此本机对象需要在堆上,这样它的内部结构就不会被垃圾收集所改变。因此,您需要将vector作为指针保存,并适当地删除它。请注意,后者并非完全无关紧要,您需要了解一些c++/CLI知识(与c#略有不同)。见http://msdn.microsoft.com/en-us/library/ms177197 (v = vs.100) . aspx。看看上次我这么做的时候,在我的文件中我有
public:
!NetClass();
~NetClass() { this->!NetClass(); } // avoid arning C4461
private:
class NativeImpl* const m_pImpl; // can't contain NativeImpldirectly
在cpp文件中我有
NetClass::!NetClass()
{
// implement finalizer in ref class
delete m_pImpl;
}
如果要包含一个以上的本机类,可能只需要在这里使用pimpl习惯用法。参见为什么应该"PIMPL"
最后,我上次这么做是很久以前的事了,我只是在说当时对我有用的东西。如果你在做这个,你真的需要知道你在做什么。我使用了一本名为《c++/CLI in Action》的书,我推荐这本书。
编辑
这篇关于STL/CLR的文章看起来很有趣:http://blogs.msdn.com/b/nikolad/archive/2006/06/16/stlclr-intro.aspx。引用
STL/CLR,最初称为STL。. NET,是Standard . NET的实现模板库(STL),可以对托管类型的对象进行操作。vc++已经有了STL的实现,但它目前是
- 具有 STL 向量类型成员的类的复制内存
- STL 向量无缘无故损坏,VC++ 2017
- 如何避免自定义 STL 向量类的智能指针 delete[] 异常?
- STL向量上出现奇怪的复制构造函数错误
- OpenMP 和不同的 STL 向量
- C++ STL 向量保留太多容量会消耗大量内存吗?
- 使用 boost Spirit 解析为 STL 向量
- C++ 在列表末尾插入元素的列表的 STL 向量
- C++ 使用数组初始化时的 STL 向量内存管理
- 仅编写 c++ stl 向量的第一个元素的正确方法
- 如何在<typename> <long> 不更改给定代码的情况下将自定义向量与 STL 向量相互转换?
- 限制指针访问STL ::向量元素
- 传递包裹在shared_ptr中的 STL 向量
- 如何将结构指针插入stl向量中并显示内容
- 将一个STL向量有效地分配给另一个STL矢量(WSL问题)
- erase() 不适用于结构/对象内的 STL 向量
- STL向量具有反向和pop/push_back成本
- 获取 STL 向量C++的地址
- Unique_ptr的 STL 向量 - 如何重置
- 带有 STL 向量的模板函数会因新的分配器而中断