【发布时间】:2023-04-04 09:45:01
【问题描述】:
如何更改以下代码,以便可以使用new 和delete 而不是malloc 和free?
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
class myclass{
private:
float **m_R;
public:
myclass();
~myclass();
float **getR(void);
void setR(void);
};
myclass::myclass()
{
// first allocate rows (for pointers)
m_R = (float**)malloc(3*sizeof(float));
// next allocate columns for float values
for(int i=0;i<3;i++)
*(m_R+i) = (float*)malloc(3*sizeof(float));
}
myclass::~myclass()
{
// first free memory allocated by columns
for(int i = 0; i < 3; i++)
{
free(m_R[i]);
}
// next free memory allocated by rows
free(m_R);
}
void myclass::setR(void)
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
m_R[i][j] = 10*i+j;
//cout << m_R[i][j] << ", ";
}
//cout << "\n";
}
}
float **myclass::getR(void)
{
return m_R;
}
int main () {
myclass obj;
obj.setR();
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
printf("%02d, ",(int)obj.getR()[i][j]);
}
cout << "\n";
}
return 0;
}
Edit1:请注意,我必须使用一个以float** 作为参数的函数(不是我写的),我别无选择(例如vector),只能使用float**。
Edit2:该函数来自Proximity Query Package (PQP),编写如下:
int
PQP_Distance(PQP_DistanceResult *result,
PQP_REAL R1[3][3], PQP_REAL T1[3], PQP_Model *o1,
PQP_REAL R2[3][3], PQP_REAL T2[3], PQP_Model *o2,
PQP_REAL rel_err, PQP_REAL abs_err,
int qsize = 2);
【问题讨论】:
-
简单回答:不要。用适当的容器替换它们。
-
你想拿一些非常糟糕的东西,然后用稍微好一点的东西来代替它吗?专业提示:不要。
-
使用矢量或附近。您的代码仅为 32 位(巧合)。您使用
sizeof(float)而不是sizeof(float *)分配 3 个float *的数组,这仅适用于 32 位系统。在 64 位系统上,它只会为您提供所需的一半内存。 -
采用
float**的“必须使用”的函数的前置/后置条件是什么。我敢打赌,他们可以在仍然使用适当的容器时遇到。 -
矢量在这里真的不合理,除了作为拐杖,因为尺寸很小且固定。 C++ 容器并非被发明为比程序员更聪明。如果看起来是这样,那不是容器的错。
标签: c++ malloc new-operator