Iteration over std::vector: unsigned vs signed index variable

What is the correct way of iterating over a vector in C++? Consider these two code fragments, this one works fine: for (unsigned i=0; i < polygon.size(); i++) { sum += polygon[i]; } and this one: for (int i=0; i < polygon.size(); i++) { sum += polygon[i]; } which generates warning: comparison between signed and unsigned integer expressions . I'm new in the world of C++,

迭代std :: vector:无符号与有符号索引变量

在C ++中迭代一个向量的正确方法是什么? 考虑这两个代码片段,这个工作正常: for (unsigned i=0; i < polygon.size(); i++) { sum += polygon[i]; } 和这个: for (int i=0; i < polygon.size(); i++) { sum += polygon[i]; } 它会生成warning: comparison between signed and unsigned integer expressions 。 我是C ++世界中的新成员,所以unsigned变量对我来说看起来有点可怕,我知道如果使用不正确

Qt: does "new without delete" cause memory leaks with controls?

I was looking at Qt example here: and inside the constructor, they have: Window::Window() { editor = new QTextEdit(); // Memory leak? QPushButton *sendButton = new QPushButton(tr("&Send message")); // Memory leak? connect(sendButton, SIGNAL(clicked()), this, SLOT(sendMessage())); QHBoxLayout *buttonLayout = new QHBoxLayout(); // Memory leak? buttonLayout->

Qt:“新的没有删除”导致内存泄漏与控制?

我在这里查看Qt示例: 并在构造函数中,它们有: Window::Window() { editor = new QTextEdit(); // Memory leak? QPushButton *sendButton = new QPushButton(tr("&Send message")); // Memory leak? connect(sendButton, SIGNAL(clicked()), this, SLOT(sendMessage())); QHBoxLayout *buttonLayout = new QHBoxLayout(); // Memory leak? buttonLayout->addStretch(); buttonL

LLVM, Initialize an integer global variable with value 0

I've been going in circles through the LLVM documentation / Stack Overflow and cannot figure out how an integer global variable should be initialized as 0 (first time using LLVM). This is some of my code currently: TheModule = (argc > 1) ? new Module(argv[1], Context) : new Module("Filename", Context); // Unrelated code // currentGlobal->id is just a string TheModule->getOrInsert

LLVM,初始化值为0的整数全局变量

我一直在通过LLVM文档/堆栈溢出进行循环,并且无法弄清整数全局变量应如何初始化为0(第一次使用LLVM)。 这是我目前的一些代码: TheModule = (argc > 1) ? new Module(argv[1], Context) : new Module("Filename", Context); // Unrelated code // currentGlobal->id is just a string TheModule->getOrInsertGlobal(currentGlobal->id, Builder.getInt32Ty()); llvm::GlobalVariable* gVar = TheModule->ge

pointer to function and ODR

There are so many questions on ODR but I cannot find what I'm looking for, so apologies if this a duplicate or if the title is inappropriate. Consider the following: struct t {t(*id)();}; template<typename T> t type() {return {type<T>};} This is an over-simplification of my attempt to define a unique identifier per type, that hopefully remains unique across different compilat

指向功能和ODR的指针

在ODR上有太多的问题,但我找不到我要找的东西,所以如果这是重复的或标题不合适的话,请致歉。 考虑以下: struct t {t(*id)();}; template<typename T> t type() {return {type<T>};} 这是我试图为每种类型定义唯一标识符的过度简化,希望这些标识符在不同的编译单元中保持唯一。 特别是,给定一个像std::string这样的具体类型T ,并且假设两个不同的编译单元在头文件中包含上面的代码,我想要表达式 type&

Is it ever OK to *not* use free() on allocated memory?

I'm studying computer engineering, and I have some electronics courses. I heard, from two of my professors (of these courses) that it is possible to avoid using the free() function (after malloc() , calloc() , etc.) because the memory spaces allocated likely won't be used again to allocate other memory. That is, for example, if you allocate 4 bytes and then release them you will have 4

*是否可以在分配的内存上使用free()?

我正在学习计算机工程,并且我有一些电子课程。 我从我的两位教授(这些课程中)听说,可以避免使用free()函数(在malloc() , calloc()等之后),因为分配的内存空间可能不会再使用分配其他内存。 也就是说,例如,如果您分配4个字节然后释放它们,您将有4个字节的空间可能不会再分配:您将有一个漏洞。 我认为这很疯狂:你不能在没有释放的情况下在堆上分配内存的情况下使用非玩具程序。 但是我没有足够的知识来解释为什

Defragmentation of dynamically allocated memory in C++

动态分配内存的碎片整理(使用new和malloc操作符分配)如何在C ++中工作? There is no defragmentation in the C++ heap because the application is free to keep pointers to allocated memory. Thus the heap manager cannot move memory around that is already allocated. The only "defragmentation" possible is if you free two adjacent blocks. Then the heap manager will combine the two blocks to a

在C ++中动态分配内存的碎片整理

动态分配内存的碎片整理(使用new和malloc操作符分配)如何在C ++中工作? 在C ++堆中没有碎片整理,因为应用程序可以自由地保留指向已分配内存的指针。 因此,堆管理器无法移动已经分配的内存。 唯一的“碎片整理”可能是如果你释放两个相邻的块。 然后堆管理器将把这两个块合并成一个可以再次用于分配的更大的空闲块。 你可能想看看slab分配器。 这不会是你的银弹,但对于具体问题你可能能够缓解压力。 在我过去的一个项

Does dynamic memory allocation differ in C and C++ in popular implementations?

As far as the respective language standards go, C offers dynamic memory allocation only through the malloc() family, while in C++ the most common form of allocation is performed by ::operator new() . The C-style malloc is also available in C++, and many "baby's first allocator" examples use it as its core allocation function, but I am curious how contemporary compilers implement th

在流行的实现中,动态内存分配在C和C ++中有所不同?

就相应的语言标准而言,C仅通过malloc()系列提供动态内存分配,而在C ++中,最常见的分配形式由::operator new() 。 C风格的malloc也可以在C ++中使用,许多“宝宝的第一个分配器”的例子都将它用作它的核心分配函数,但我很好奇当代编译器如何实现实际的生产操作符 - 新。 它仅仅是一个围绕malloc()简单包装,还是因为与典型的C程序相比,典型的C ++程序存在相当不同的内存分配行为,从根本上实现了它? [编辑:我认为主要区

dynamically allocated memory after program termination

When a C/C++ program containing the dynamically allocated memory(using malloc/new) without free/delete calls is terminated, what happens to that dynamically allocated memory? Does the operating system takes back the memory or does that memory becomes unaccessible to other programs? I don't think that there are any guarantees in the language standard, but modern operating systems which supp

程序终止后动态分配内存

当包含动态分配的内存(使用malloc / new)而没有释放/删除调用的C / C ++程序终止时,会发生什么动态分配的内存? 操作系统是否收回内存或者该内存是否无法被其他程序访问? 我认为语言标准没有任何保证,但支持稀疏虚拟内存和内存保护的现代操作系统(如MacOS X,Linux,所有最新版本的Windows以及所有当前制造的电话手持设备)都会自动清理在严重行为的进程(当它们终止时)之后启动并释放内存。 但是只要程序正在运行,

What is memory fragmentation?

I've heard the term "memory fragmentation" used a few times in the context of C++ dynamic memory allocation. I've found some questions about how to deal with memory fragmentation, but can't find a direct question that deals with it itself. So: What is memory fragmentation? How can I tell if memory fragmentation is a problem for my application? What kind of program is

什么是内存碎片?

我曾经在C ++动态内存分配的上下文中听过“内存碎片”这个术语。 我发现了一些关于如何处理内存碎片的问题,但是找不到直接处理内存碎片的问题。 所以: 什么是内存碎片? 如何判断内存碎片对我的应用程序是否有问题? 什么样的节目最有可能遭受? 处理内存碎片的常用方法有哪些? 也: 我听说使用动态分配可能会增加内存碎片。 这是真的? 在C ++的上下文中,我理解所有的标准容器(std :: string,std :: vector

Ownership/delete'ing the facet in a locale (std::locale)

I wrote the following function to get a date/time string using boost.date_time. namespace bpt = boost::posix_time; string get_date_time_string(bpt::ptime time) { bpt::time_facet * facet(new bpt::time_facet); facet->format("%Y%m%d%H%M%S"); stringstream return_value; return_value.imbue(std::locale(std::locale::classic(), facet)); return_value << time; return return_value.st

所有权/删除区域设置(std :: locale)

我写了下面的函数来使用boost.date_time来获取日期/时间字符串。 namespace bpt = boost::posix_time; string get_date_time_string(bpt::ptime time) { bpt::time_facet * facet(new bpt::time_facet); facet->format("%Y%m%d%H%M%S"); stringstream return_value; return_value.imbue(std::locale(std::locale::classic(), facet)); return_value << time; return return_value.str(); } 我有一个关