首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态内存分配、堆、间接、NULL

动态内存分配、堆、间接、NULL
EN

Stack Overflow用户
提问于 2014-03-07 03:10:35
回答 2查看 293关注 0票数 0

我试图保证我动态分配的内存不会指向任何地方。

我尝试了以下几种方法

代码语言:javascript
复制
template<typename T>
[...something here...]
T *mem = new T[size];

for ( int i=0; i<size; i++ )
{
    (mem+i) = NULL;
}  
[...something else there...]

就像一个人可以写

代码语言:javascript
复制
int *pInt = new int;
pInt = NULL;

但这并不起作用,因为在上面的示例中,mem不是“左值”?

为什么只有当我在堆上动态分配更多特定于类型的内存时,才会出现这种情况?

此外,如果我使用template-function,会发生一件奇怪的事情,因为它似乎是合法的

代码语言:javascript
复制
template<typename T>
[...something here...]
T mem = new T[size];

for ( int i=0; i<size; i++ )
{
    *(mem+i) = NULL;

    /* or the equivalent
    mem[i] = NULL;
    */
}  
[...something else there...]

怎么可能将NULL (基本上就是int值0)赋给一个基本上可以是任何东西的变量或对象呢?它可能是一个int变量,很好,它会工作的。但是如果我用std::string调用模板函数会怎么样呢?它应该完全不起作用,对吧?那么为什么写这样的东西看起来是合法的呢?

是不是有编写泛型程序的自由,但也有责任注意,不要用错误的类型调用某些泛型函数?

EN

回答 2

Stack Overflow用户

发布于 2014-03-07 03:18:25

但是它不起作用,因为在上面的例子中,“

”不是"lvalue"?

实际上,您正在尝试重新分配临时指针mem+i;这没有任何意义。假设您想要将数组成员(mem[i]*(mem+i))设置为某个值;尽管可能不会将数组成员设置为NULL,除非T应该是指针类型。

在包含单个对象的示例中,您重新分配了指向已分配对象的唯一指针;因此,您无法使用或删除该对象。

怎么可能将NULL (基本上就是int值0)赋给一个基本上可以是任何东西的变量或对象?

因为在C++11之前,唯一有效的null指针常量(也就是NULL宏的唯一有效扩展)是零值整数常量;所以代码扩展为

代码语言:javascript
复制
*(mem+i) = 0;

这对许多类型都有效。现在,NULL可能会(也可能不会)扩展到nullptr,在这种情况下,它只对指针类型有效。

字符串,但是如果我用std::

调用模板函数会怎么样呢?它应该完全不起作用,对吧?

std::string有一个构造函数和一个赋值运算符,它接受指向C样式字符串的指针,例如

代码语言:javascript
复制
std::string hello = "Hello, world!";

它们也可以采用空指针,给出未定义的行为。

票数 1
EN

Stack Overflow用户

发布于 2014-03-07 03:36:57

你的代码是:

代码语言:javascript
复制
for ( int i=0; i<size; i++ )
{
  (mem+i) = NULL;
}

在这种情况下,(mem+i)是一个临时结果,称为rvalue。右值是临时的,不能为其赋值。只能将值指定给左值。(顺便说一下,我认为这不是您想要做的:我猜您想要更改指针所指向的内存,而不是指针中存储的地址值)

代码语言:javascript
复制
for ( int i=0; i<size; i++ )
{
  mem[i] = NULL;
 *(mem+i) = NULL;
}

在这种情况下,也会计算临时结果(在两种情况下都是mem+i),但用于寻址正确的内存。因此,在这两种情况下,指向的内存都是左值。

如果您使用模板,则必须记住这些是模板;-)如果模板不在任何地方使用,则永远不会编译模板代码。如果使用它,这取决于您使用哪种类型的变量/类作为模板参数。

您可以编写以下代码:

代码语言:javascript
复制
template<typename T>
void func( T a)
{
  a.foo = "bar";
  a.my_func( 3.14);
}

这段代码看起来很奇怪,但它可以为任何结构或类的每个a编译,这些结构或类具有成员变量/对象foo,可以分配一个const char和一个成员函数或函数指针,或者具有重载的名为my_funcoperator ()的对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22233759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档