询问关于带有原始缓冲区的特征库的一个问题
Ask about one issue regarding eigen library with raw buffer
最近我正在使用特征库,我发现了这个关于原始缓冲区操作的问题。
在下面的代码中,我创建了两个9整数的原始缓冲区作为输入和输出。之后,我使用两个特征矩阵in/out,通过放置新的方法与特征映射来包装这两个缓冲区。然后我调用一个简单的转置运算。然而,调用转置操作的不同方式将导致完全不同的原始缓冲区结果。如果我直接调用特征转置函数,如代码1所示,结果是完全正确的,无论是结果矩阵和相应的原始缓冲区。但是,当我将转置操作包装在返回特征矩阵的自定义函数中时,如代码2所示,问题就出现了。事实证明,只有结果矩阵是好的,但原始缓冲区似乎是损坏的。有人知道这个问题吗?这是一个固有的bug吗?
<标题>代码1#include <iostream>
#include <Eigen/Dense>
#include <Eigen/Dense>
using Eigen::MatrixXi;
int main() {
int *in;
in = new int[9];
for (int i = 0; i < 9; i++)
in[i] = i;
int *out;
out = new int[9];
for (int i = 0; i < 9; i++)
out[i] = 0;
MatrixXi m_in;
m_in.resize(3, 3);
new (&m_in) Eigen::Map<MatrixXi>(in, 3, 3);
MatrixXi m_out;
m_out.resize(3, 3);
new (&m_out) Eigen::Map<MatrixXi>(out, 3, 3);
m_out = m_in.transpose();
std::cout << m_out << std::endl;
std::cout << "------------" << std::endl;
for (int i = 0; i < 9; i++)
std::cout << out[i] << std::endl;
return 0;
}
代码1的结果:
0 1 2
3 4 5
6 7 8
------------
0
3
6
1
4
7
2
5
8
<标题>代码2 h1> P_4 标题>标题>
您正在用另一个不同类型的对象覆盖一个对象。m_in
被Eigen::Map<MatrixXi>(in, 3, 3)
的内容覆盖,因为它是放置new的目标。m_in
不是in
缓冲区的所有者,以后的操作假设它是将破坏堆。
MatrixXi m_in;
m_in.resize(3, 3);
new (&m_in) Eigen::Map<MatrixXi>(in, 3, 3);
将这3行(以及m_out的类似行)替换为:
Eigen::Map<MatrixXi> m_in(in, 3, 3);
这将不会从堆中分配任何额外的内存,而是利用先前分配的in[]
和out[]
。
另一个问题是in[]
和out[]
没有被删除。这并不重要,因为程序无论如何都要退出,但是应该不鼓励有内存泄漏倾向的编程风格。
相关文章:
- 一个关于在C++中重载布尔运算符的问题
- 发送一个带有libcurl C++问题的帖子请求:s
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- 关于复制构造函数的一个棘手问题
- Tmax(0x7fffffff 的一个奇怪问题,为什么 (!x) == x?
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 我正在尝试解决一个需要数组总和值但代码不起作用的问题,我想做这样的事情
- 在解决链表问题时创建一个额外的节点是一个好习惯吗?
- 存储另一个函数返回的布尔数组时遇到问题
- 为什么在分配给成员变量之前获取unique_ptr的返回是一个问题?
- 我在使用 boost::serialization 时遇到了一个问题,我的代码在 Linux 中运行良好,但在 Wind
- 我有一个关于C++提升的问题:: asio 和 std :: 异步
- 这是一个二叉搜索树吗?黑客排名问题
- 几对性能问题(一个较大的向量与较小的块向量),值得存储迭代索引以进行矢量访问
- GLSL问题:一个程序中有多个着色器
- 设计问题——一个函数调用所有三个函数