C++中delete
和delete[]
运算符有什么区别?
给定函数foo:
fun foo(m: String, bar: (m: String) -> Unit) {
bar(m)
}
Run Code Online (Sandbox Code Playgroud)
我们可以做的:
foo("a message", { println("this is a message: $it") } )
//or
foo("a message") { println("this is a message: $it") }
Run Code Online (Sandbox Code Playgroud)
现在,假设我们有以下功能:
fun buz(m: String) {
println("another message: $m")
}
Run Code Online (Sandbox Code Playgroud)
有没有办法可以将"buz"作为参数传递给"foo"?就像是:
foo("a message", buz)
Run Code Online (Sandbox Code Playgroud) 我已成功在Linux Mint 12上使用gcc.现在我收到错误.我最近做了一些.so构建并安装了很久以前的Clang,但是自从这两个事件都成功编译后,所以不确定发生了什么变化.我使用GUI软件管理器删除然后再次安装gcc,但结果是一样的:
~/code/c/ut: which gcc
/usr/bin/gcc
~/code/c/ut: gcc -std=c99 -Wall -Wextra -g -c object.c
gcc: error trying to exec 'cc1': execvp: No such file or directory
Run Code Online (Sandbox Code Playgroud) 在c++03
它是很清楚,删除一个空指针没有任何效果.实际上,它明确指出§5.3.5/2
:
在任一替代方案中,如果delete的操作数的值是空指针,则操作无效.
然而,在目前的草案对于c++0x
这句话似乎缺少.在草稿的其余部分,我只能找到句子,说明如果delete-expression的操作数不是空指针常量会发生什么.是否删除仍然定义的空指针c++0x
,如果是,在哪里?
笔记:
有大量的间接证据表明它仍然有明确的定义.
首先,有两句话§5.3.5/2
说明
在第一个替代(删除对象)中,delete的操作数的值可以是空指针值,...
和
在第二个替代(删除数组)中,delete的操作数的值可以是空指针值或...
这些说操作数被允许为空,但是它们自己实际上并没有定义如果是的话会发生什么.
其次,改变意义delete 0
是一个重大的突破性变化,标准委员会不太可能做出这种特殊的改变.此外,没有提到这是c++0x
草案兼容性附件(附件C)的重大变化.但是,附件C是一个信息性部分,因此对标准没有任何解释.
另一方面,删除空指针要求无效的事实意味着额外的运行时检查.在很多代码中,操作数永远不能为空,因此这个运行时检查与零开销原则相冲突.也许委员会刚刚决定改变行为,使标准c ++更符合语言的既定设计目标.
我有这个代码:
#include <array>
int main(int, char **argv)
{
std::array<int, 3> a = {1,2,3};
}
Run Code Online (Sandbox Code Playgroud)
这编译很好(-std = c ++ 11),但如果你包含-Wall它会发出我不明白的警告:
clang_pp_error.cpp:5:28: warning: suggest braces around initialization of subobject [-Wmissing-braces]
std::array<int, 3> a = {1,2,3};
^~~~~
{ }
Run Code Online (Sandbox Code Playgroud) 我已分配和对象数组
Objects *array = new Objects[N];
Run Code Online (Sandbox Code Playgroud)
我该如何删除这个数组?只是
delete[] array;
Run Code Online (Sandbox Code Playgroud)
或者迭代数组的元素?
for(int i=0;i<N;i++)
delete array[i];
delete[];
Run Code Online (Sandbox Code Playgroud)
谢谢
更新:
我改变了循环体
delete &array[i];
Run Code Online (Sandbox Code Playgroud)
强制代码编译.
我试图通过我的程序,我从Code :: Blocks获得以下消息
Selecting target:
Debug
ERROR: You need to specify a debugger program in the debuggers's settings.
(For MinGW compilers, it's 'gdb.exe' (without the quotes))
(For MSVC compilers, it's 'cdb.exe' (without the quotes))
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法弄清楚我在哪里输入gdb.exe.
我在nuwen.net上使用minGW的mingw-w64(x64)分支.这是来自7.1版本的gcc:
gcc --version
gcc (GCC) 7.1.0
Run Code Online (Sandbox Code Playgroud)
我正在编译这个程序:
#include <stdio.h>
int main(void)
{
size_t a = 100;
printf("a=%lu\n",a);
printf("a=%llu\n",a);
printf("a=%zu\n",a);
printf("a=%I64u\n",a);
}
Run Code Online (Sandbox Code Playgroud)
有警告和c11标准:
gcc -Wall -Wextra -Wpedantic -std=c11 test_size_t.c
Run Code Online (Sandbox Code Playgroud)
我收到这些警告:
test_size_t.c: In function 'main':
test_size_t.c:6:14: warning: format '%lu' expects argument of type 'long unsigned int', but argument 2 has type 'size_t {aka long long unsigned int}' [-Wformat=]
printf("a=%lu\n",a);
~~^
%I64u
test_size_t.c:6:14: warning: format '%lu' expects argument of type 'long unsigned int', but argument 2 has type 'size_t {aka long long unsigned …
Run Code Online (Sandbox Code Playgroud) Object 的"public final Class <?> getClass()"方法的文档说:
实际的结果类型是Class <?extends | X |> where | X | 是调用getClass的表达式的静态类型的擦除.例如,此代码片段中不需要强制转换:
我不明白这个解释,特别是关于什么| X | 据说 - "擦除了调用getClass的表达式的静态类型".
什么形式的符号是| X | ?或者,也许,其他地方| X | 是否使用了表示法?