相关疑难解决方法(0)

运算符重载的基本规则和习惯用法是什么?

注意:答案是按照特定的顺序给出的,但由于许多用户根据投票而不是给出的时间对答案进行排序,因此这里是答案索引,它们是最有意义的顺序:

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ operator-overloading operators c++-faq

2074
推荐指数
8
解决办法
88万
查看次数

运算符new将内存初始化为零

有这样的代码:

#include <iostream>

int main(){
  unsigned int* wsk2 = new unsigned int(5);
  std::cout << "wsk2: " << wsk2 << " " << *wsk2 << std::endl;
  delete wsk2;
  wsk2 = new unsigned int;
  std::cout << "wsk2: " << wsk2 << " " << *wsk2 << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果:

wsk2: 0x928e008 5
wsk2: 0x928e008 0
Run Code Online (Sandbox Code Playgroud)

我读过new没有用零初始化内存.但似乎它确实如此.它是如何工作的?

c++ memory-management

66
推荐指数
3
解决办法
7万
查看次数

为什么要替换默认的new和delete运算符?

为什么一个会替换默认的操作newdelete使用自定义newdelete运营商?

这是继续重载新的和删除在非常有启发性的C++ FAQ:
运算符重载.

本FAQ的后续条目是:
我应该如何编写符合ISO C++标准的自定义newdelete运算符?

注意:答案基于Scott Meyers的"更有效的C++"课程.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ operator-overloading c++-faq new-operator delete-operator

64
推荐指数
4
解决办法
2万
查看次数

如何在C++中跟踪内存分配(尤其是新建/删除)

如何跟踪C++中的内存分配,尤其是new/ delete.对于一个对象,我可以轻松覆盖operator new,但我不确定如何全局覆盖所有分配,以便它们通过我的自定义new/ delete.这应该不是一个大问题,但我不确定应该怎么做(#define new MY_NEW?).

一旦这个工作,我会认为它足以在分配的指针/位置的某处有一个映射,所以我可以跟踪当前"活动"的所有分配,并且 - 在应用程序结束时 - 检查分配没有被释放的.

好吧,这似乎再次像肯定已经多次完成了几次,所以任何好的库(最好是便携式的)?

c++ debugging memory-management

30
推荐指数
4
解决办法
3万
查看次数

SSE,内在函数和对齐

我使用了很多SSE编译器内在函数编写了一个3D矢量类.一切正常,直到我开始实现具有3D矢量作为新成员的类.我在发布模式下经历了奇怪的崩溃,但在调试模式下却没有,反之亦然.

所以我读了一些文章,并认为我需要将拥有3D矢量类实例的类对齐到16个字节.所以我只是在类之前添加了_MM_ALIGN16(__declspec(align(16)),如下所示:

_MM_ALIGN16 struct Sphere
{
    // ....

    Vector3 point;
    float radius
};
Run Code Online (Sandbox Code Playgroud)

这似乎首先解决了这个问题.但在更改了一些代码后,我的程序又开始以奇怪的方式崩溃.我在网上搜索了一些,发现了一篇博客文章.我尝试了作者Ernst Hot为解决这个问题做了什么,它对我也有用.我在我的类中添加了new和delete运算符,如下所示:

_MM_ALIGN16 struct Sphere
{
    // ....

    void *operator new (unsigned int size)
     { return _mm_malloc(size, 16); }

    void operator delete (void *p)
     { _mm_free(p); }

    Vector3 point;
    float radius
};
Run Code Online (Sandbox Code Playgroud)

恩斯特提到这种方法也可能存在问题,但他只是链接到一个不再存在的论坛,而没有解释为什么它可能会有问题.

所以我的问题是:

  1. 定义运算符有什么问题?

  2. 为什么不添加_MM_ALIGN16足够的类定义?

  3. 处理SSE内在函数的对齐问题的最佳方法是什么?

c++ sse alignment intrinsics

24
推荐指数
1
解决办法
1万
查看次数

弱连接的实际应用是什么?

使用特殊编译器命令可以将符号声明为.根据维基百科:

弱符号是目标文件或动态库中的符号定义,可以被其他符号定义覆盖

在什么场景或什么应用程序你需要弱符号?什么是典型用例?

c c++ linker

22
推荐指数
5
解决办法
1万
查看次数

为什么operator delete的签名有两个参数?

我一直在阅读有关重载新的和删除(以及相关主题,如放置新/删除).到目前为止,令我困惑的一件事是operator delete的标准签名是(在类范围内):

void operator delete(void *rawMemory, std::size_t size) throw();
Run Code Online (Sandbox Code Playgroud)

删除的方式如下:

MyClass* ptr = new MyClass;
delete ptr;
Run Code Online (Sandbox Code Playgroud)

那么,如何delete ptr;为大小提供第二个参数?另外,在这种情况下,我可以假设MyClass*被隐式转换为void*吗?

c++ memory

9
推荐指数
2
解决办法
2852
查看次数

如果我为一个类编写运算符new和delete,我是否必须编写所有重载?

C++ Reference页面列出了全局新运算符的 8个特定类的重载.其中四个是为2017版C++添加的.

特定于类的分配函数

void* T::operator new  ( std::size_t count );   
void* T::operator new[]( std::size_t count );
void* T::operator new  ( std::size_t count, std::align_val_t al ); // (since C++17)
void* T::operator new[]( std::size_t count, std::align_val_t al ); // (since C++17)
Run Code Online (Sandbox Code Playgroud)

特定于类的放置分配功能

void* T::operator new  ( std::size_t count, user-defined-args... );
void* T::operator new[]( std::size_t count, user-defined-args... );
void* T::operator new  ( std::size_t count,
    std::align_val_t al, user-defined-args... ); // (since C++17)
void* T::operator new[]( std::size_t count,
     std::align_val_t …
Run Code Online (Sandbox Code Playgroud)

c++ memory-management new-operator delete-operator

9
推荐指数
1
解决办法
698
查看次数

在C++中重载全局运算符new/delete

我正在尝试重载全局运算符new和删除性能敏感的应用程序.我已经阅读了http://www.informit.com/articles/article.aspx?p=30642&seqNum=3中描述的问题以及使用英特尔TBB分配器的建议http://www.intel.com/technology/itj/ 2007/v11i4/5-基金会/ 5-memory.htm

由于我第一次超载新的和删除,我有几个问题.

我应该在包含"新"调用的所有文件中包含我的新标题Allocator.h(或Pre.h),其中包含重载的新函数吗?这很乏味.

或者我应该在每个翻译单元中使用包含Allocator.h(之前)的"gcc -include Allocator.h ..."?我希望尽可能保持代码平台的独立性.所有编译器都支持类似于"gcc -include"的东西吗?

c++ operator-overloading

8
推荐指数
1
解决办法
1万
查看次数

Using placement new in generic programming

When using placement new in generic code to construct an object at a specified address, the usage pattern is a bit different from usual code. For example, consider this implementation of uninitialized_copy: ([uninitialized.copy])

template <class It, class For>
For uninitialized_copy(It first, It last, For dest)
{
    using T = typename std::iterator_traits<For>::value_type;
    for (; first != last; ++first, (void)++dest)
        ::new (static_cast<void*>(std::addressof(*dest))) T(*first);
}
Run Code Online (Sandbox Code Playgroud)

This post addresses the following points from the perspective of the standard:

  • why ::new is …

c++ c++-faq generic-programming placement-new language-lawyer

8
推荐指数
1
解决办法
143
查看次数