问题描述
我在作为对象成员的指针上使用了 std::malloc()。在一个方法中,它抛出了一个错误。
[...]
class SomeClass
{
public:
void method()
{
this.ptr = std::malloc(4);
}
int* ptr;
}
[...]
Error: Expression must have class type
我的程序有什么问题?
解决方法
这可能是因为 this
是一个指针并尝试使用 .
访问它。
此外 malloc 返回一个 void*
所以你必须转换
试试写这个:
this->ptr = static_cast<int *>(std::malloc(4));
,
您至少有两个问题:
首先,它应该是 this->ptr
而不是点。
其次,您必须将 malloc()
的结果强制转换为您想要的指针类型。例如,this->ptr = static_cast<int *>(malloc(4));
您的代码也存在一些其他问题。
-
你必须
free()
你分配的指针。如果你malloc
它,你也必须在某个地方free
它。 -
您假设
int
的大小为四个字节。这是不正确的。您应该使用sizeof(int)
。或者至少添加一个static_assert(sizeof(int) == 4);
如果您必须假设它。 -
如果你像这样使用
new
来分配内存(而不是malloc
):this->ptr = new int;
,你同时解决了上面的两个问题。您不需要强制转换返回的指针,并且您不会假设 int 的大小始终为 4。 -
如果您使用
new
,请不要忘记delete
指针(而不是free
。) -
始终将您的指针初始化为
nullptr
,并记住在释放/删除它们后也将它们设置为nullptr
。这有助于您避免一些常见的无提示错误。
在风格上,您可以避免使用原始指针,而是使用 std::unique_ptr<int>
之类的东西。但这取决于你。
C++ 不是 Java。您需要 this->
而不是 this.
。
尽管在您的情况下,您可以简单地编写 ptr = (int*)std::malloc(4)
,因为 this->
是隐式的。
更好的是,写 ptr = new int;
因为那样你就不会对 sizeof(int)
做出假设。不要忘记在某处也需要一个 delete int;
,并且需要担心赋值运算符、复制构造函数和析构函数。
对于 std::unique_ptr<int>
类型使用 std::shared_ptr<int>
或 ptr
更好,因此您无需担心 delete
。
也许更好,如果要求允许,使用 int
作为成员类型。
this.ptr
无效!
this
是一个指针,必须使用指针运算符访问成员:
this->ptr = static_cast<int *>(std::malloc(4));
,
什么奇怪的编译器会给出这样的错误信息?
它抱怨 random_date.strftime("%d.%m.%Y")
表达式中点运算符的左侧。点运算符假定左侧应该是类类型,而 this.ptr
是指向类类型的指针。您必须使用 this
。
其次,malloc 返回 ->
,您必须对其进行转换。避免麻烦并使用 void*
除非您确实必须使用 malloc。