C++ 删除内存字段(数组)中的单个字节
我有一个数组C++ 删除内存字段(数组)中的单个字节,c++,memory,pointers,C++,Memory,Pointers,我有一个数组 int count=5; char * array; array=new char[count]; //now I want to do this: delete[1]->array+1; delete[1]->array+3; 我该怎么做呢 释放的内存不能再与程序关联,但是数组+0、数组+2和数组+4需要保持锁定状态 我想有一个共享内存块,它不与任何程序相关联,任何程序都可以使用它而无需特殊权限 这样做的目的是防止系统将此节分配给其他程序,或者至少降低它这样做
int count=5;
char * array;
array=new char[count];
//now I want to do this:
delete[1]->array+1;
delete[1]->array+3;
我该怎么做呢
释放的内存不能再与程序关联,但是数组+0、数组+2和数组+4需要保持锁定状态
我想有一个共享内存块,它不与任何程序相关联,任何程序都可以使用它而无需特殊权限
这样做的目的是防止系统将此节分配给其他程序,或者至少降低它这样做的概率。如果使用
new[]
操作符分配数组,则无法执行此操作。您需要做的是使用malloc()
分配数组,使用memmove()
删除字节,使用realloc()
将数组重新分配到其大小减1,然后使用free()
释放数组。不能删除C/C++数组中的元素
但是,您可以有一个指针数组,并且只为所需的元素分配内存,其余的可以为空。然而,这改变了定义,它不再是字符数组,而是指向字符的指针数组
您试图实现什么?正如其他建议的那样,严格地说,您向系统请求单个块(
count
element-wide),并且不能将其分块返回。
此外,还不清楚是否要保留剩余块的索引
实际上你有:
addr. a b c d e
|____| ----> |_|_|_|_|_|
array 0 1 2 3 4
addr. a c e
|____|-----> |_|_|_|
array 0 1 2
您可以选择:
addr. a b c d e
|____| ----> |_|_|_|_|_|
array 0 1 2 3 4
addr. a c e
|____|-----> |_|_|_|
array 0 1 2
通过执行另一个分配,复制要保留的值,并返回第一个块
否则,您必须根据需要更改整个模型
|____|----->|____|____|____|____|____|
| | | | |
V V V V V
|_| |_| |_| |_| |_|
这样就可以根据需要进行更改
|____|----->|____|____|____|____|____|
| | | | |
V V V V V
|_| x |_| x |_|
但这意味着要玩指针游戏。就我个人而言,我建议你首先不要显式分配内存!<代码>新< /COD>和
std::string
,它支持从中间删除元素的函数:
std::string array(count);
array.erase(array.begin() + 1);
array.erase(array.begin() + 3);
您的意思是删除给定索引处的字符?不。我想释放内存。在您的示例中,您只分配了1块内存。是否希望每个字符单独分配?为什么要这样做?如果您告诉我们,我们可能会建议其他方法来归档您想要的内容。顺便说一句:请记住,C/C++(以及其他相关内容)使用额外内存进行动态内存分配,以跟踪分配的块,例如([size,next]yourdata),([size1,next1]yourdata1),([size2,next2]yourdata2)。。。这太简单了,但我希望你能理解,这些结构超过了你试图释放的1-2个字节。不过我希望控制物理内存。如果我没弄错的话,字符串擦除只是重新排列指针数组。没有操作系统在字节级别控制内存分配。它们都至少使用页面。在页面抽象之上,内存分配设施使用自己分配的内存块。。。而获得“物理”记忆几乎是不可能的。如果你解释一下你真正想做什么,而不是你认为该怎么做,也许会有所帮助。