相关疑难解决方法(0)

为什么以及何时需要提供自己的删除器?

为什么以及何时需要提供自己的删除器?关键字不delete足够吗?

如果您使用智能指针来管理分配的内存以外的资源new,请记住传递删除器.


更新:

正如在评论中被问到的那样,我不清楚引用的文本和示例的原因是我在想某些东西是错误的,这是因为我一直在考虑智能指针只是为了动态内存管理而发明的.所以这个例子使用智能指针管理非动态内存让我感到困惑.

老人的一个很好的解释:

智能指针根本不关心动态内存本身.它只是一种在需要时跟踪某些东西的方法,并在它超出范围时销毁它.提到文件句柄,网络连接等的要点是指出它们不是动态内存,但智能指针可以管理它们就好了.


C++ Primer 5th采用伪网络连接(不定义析构函数)来说明.

坏:

struct destination; // represents what we are connecting to
struct connection; // information needed to use the connection
connection connect(destination*); // open the connection
void disconnect(connection); // close the given connection
void f(destination &d /* other parameters */)
{
// get a connection; must remember to close it when done
connection c = connect(&d);
// use the connection
// if we …
Run Code Online (Sandbox Code Playgroud)

c++ smart-pointers

15
推荐指数
2
解决办法
1899
查看次数

:: operator new(size_t)是否使用malloc()?

是在内部::operator new(size_t)调用malloc(),还是直接使用系统调用/特定于操作系统的库调用?C++标准说什么?

这个答案中它说:

malloc()保证返回与任何标准类型对齐的地址.::operator new(n)只保证返回一个不大于任何标准类型的地址n,如果T不是一个字符类型,那么new T[n]只需要返回一个对齐的地址T.

这表明new()不需要打电话malloc().

注意:这里有一个SO 问题有关的一切operator new其他比分配.

c++ malloc new-operator dynamic-memory-allocation

12
推荐指数
2
解决办法
3626
查看次数

delete []如何知道数组的大小?

我很好奇delete []如何计算分配内存的大小.当我做的事情:

int* table = new int[5];
delete[] table;
Run Code Online (Sandbox Code Playgroud)

我明白表的内存是释放的.但是,如果我将指针重新分配给某个不同的表,会发生什么.

int* table = new [5];
int* table2 = new [9];
table = table2;
delete[] table;
Run Code Online (Sandbox Code Playgroud)

我可以免费使用5或9号桌子吗?我对new []和delete []如何共享有关其大小的信息感兴趣.或许我错过了一些必不可少的东西.

c++

11
推荐指数
2
解决办法
2945
查看次数

如何覆盖C++中的删除行为?

我遇到的问题是,据我所知,删除操作符应该是一个静态函数,但有时编译器(VC++)似乎将它视为动态.

鉴于:

class Base
{
public:
  void* operator new(size_t size) { /* allocate from custom heap */ }
  void operator delete(void *p) { customFree(p, sizeof(Base)); }

  Base() {}
  virtual ~Base() {}
};

class Derived: public Base
{
public:
  void* operator new(size_t size) { /* allocate from custom heap */ }
  void operator delete(void *p) { customFree(p, sizeof(Derived)); }

  Derived() {}
  virtual ~Derived() {}
}
Run Code Online (Sandbox Code Playgroud)

我看到的是删除基指针将导致调用Derived::opeator删除.

Base *p = new Derived();
delete p; //calls Derived::operator delete
Run Code Online (Sandbox Code Playgroud)

如果我没有定义任何析构函数,那么我得到了我预期的结果:调用Base …

c++ memory

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

'malloc'和'new'如何运作?它们有何不同(实施明智)?

我知道它们在语法上是如何不同的,并且C++使用new,而C使用malloc.但他们如何运作,在一个高级别的解释?

看看new/delete和malloc/free有什么区别?

c c++

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