C++的内存分配有关问题

C++的内存分配问题
char* ch = new char('d'); 对应 delete ch;
char* ch = new char[100]; 对应 delete [] ch; 

以上的ch指向的内容,应该都是存放在堆中吧,分配方式为动态,也就是说,需要手动来使用delete释放对应的空间,防止内存泄漏。

而对于 char* ch = "ddd";
不论我使用delete ch或是delete [] ch都会报错。

那么这是否就意为着,用这种方式定义的"ddd"存放的位置并不在堆里,它所占的空间也并不是在堆里面以动态分配的。
那么这个"ddd"是存放在哪里呢?栈中?静态存储区?常量存储区?
这个“ddd”是否是由编译器来自动完成空间的回收呢?需要手动释放空间吗?
如果由编译器自动完成回收,又是在什么时刻呢(比如该语句所在的整个函数体结束时回收)。

我知道C++的内存管理是个很复杂的机制,但是希望能学好这方面的知识来提升我的编程能力,希望各位大大能讲的详细点,最好能拓展一下,谢谢了。


------解决方案--------------------
char* ch = "ddd";
这样的,叫做字符常量区,不允许修改;这个是系统自动分配内存的,故无需手动释放,至于说系统什么时候收回,跟你定义一般的int的作用域一样,如果是局部的,跳出这个局部,系统就会收回,如果是全局的,那么直到程序退出系统自动收回……
------解决方案--------------------
char* a="ddd";
“ddd"存储在常量存储区,a只是一个指针指向了这个常量,不需要手动释放。
------解决方案--------------------
char* ch = "ddd";将"ddd"存在常量存储区,而不是堆上,必然不能delete啊

还有 new 和 delete 请成对使用。